From 096245d3fc85b1a5af2d1795bba0b0d6f6c08ad2 Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Tue, 13 Sep 2016 18:41:15 +0100 Subject: [PATCH 1/8] By default don't import 3rd-party Python modules, only stdlib ones. Fixes #854. --- raven/transport/__init__.py | 20 ++++++++++---------- raven/transport/registry.py | 22 +++++++++++----------- raven/transport/threaded_requests.py | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/raven/transport/__init__.py b/raven/transport/__init__.py index 3549c7b6a..20728d08f 100644 --- a/raven/transport/__init__.py +++ b/raven/transport/__init__.py @@ -9,13 +9,13 @@ # manually import/register transports somehow from __future__ import absolute_import -from raven.transport.base import * # NOQA -from raven.transport.eventlet import * # NOQA -from raven.transport.exceptions import * # NOQA -from raven.transport.gevent import * # NOQA -from raven.transport.http import * # NOQA -from raven.transport.requests import * # NOQA -from raven.transport.registry import * # NOQA -from raven.transport.twisted import * # NOQA -from raven.transport.threaded import * # NOQA -from raven.transport.tornado import * # NOQA +# from raven.transport.base import * # NOQA +# from raven.transport.eventlet import * # NOQA +# from raven.transport.exceptions import * # NOQA +# from raven.transport.gevent import * # NOQA +# from raven.transport.http import * # NOQA +# from raven.transport.requests import * # NOQA +# from raven.transport.registry import * # NOQA +# from raven.transport.twisted import * # NOQA +# from raven.transport.threaded import * # NOQA +# from raven.transport.tornado import * # NOQA diff --git a/raven/transport/registry.py b/raven/transport/registry.py index 30a90c310..d1a1c8747 100644 --- a/raven/transport/registry.py +++ b/raven/transport/registry.py @@ -8,15 +8,15 @@ from __future__ import absolute_import # TODO(dcramer): we really should need to import all of these by default -from raven.transport.eventlet import EventletHTTPTransport +# from raven.transport.eventlet import EventletHTTPTransport from raven.transport.exceptions import DuplicateScheme from raven.transport.http import HTTPTransport -from raven.transport.gevent import GeventedHTTPTransport -from raven.transport.requests import RequestsHTTPTransport +# from raven.transport.gevent import GeventedHTTPTransport +# from raven.transport.requests import RequestsHTTPTransport from raven.transport.threaded import ThreadedHTTPTransport from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport -from raven.transport.twisted import TwistedHTTPTransport -from raven.transport.tornado import TornadoHTTPTransport +# from raven.transport.twisted import TwistedHTTPTransport +# from raven.transport.tornado import TornadoHTTPTransport from raven.utils import urlparse @@ -74,10 +74,10 @@ def compute_scope(self, url, scope): default_transports = [ HTTPTransport, ThreadedHTTPTransport, - GeventedHTTPTransport, - TwistedHTTPTransport, - RequestsHTTPTransport, - ThreadedRequestsHTTPTransport, - TornadoHTTPTransport, - EventletHTTPTransport, + # GeventedHTTPTransport, + # TwistedHTTPTransport, + # RequestsHTTPTransport, + # ThreadedRequestsHTTPTransport, + # TornadoHTTPTransport, + # EventletHTTPTransport, ] diff --git a/raven/transport/threaded_requests.py b/raven/transport/threaded_requests.py index 431c2eb56..d194dd9b8 100644 --- a/raven/transport/threaded_requests.py +++ b/raven/transport/threaded_requests.py @@ -8,7 +8,7 @@ from __future__ import absolute_import from raven.transport.base import AsyncTransport -from raven.transport import RequestsHTTPTransport +from raven.transport.requests import RequestsHTTPTransport from raven.transport.threaded import AsyncWorker From 7a6a6a7b8c1aee6e805b6dec367b104d9d3d1fbc Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Wed, 14 Sep 2016 17:35:33 +0100 Subject: [PATCH 2/8] Add note about non-stdlib transports no longer being imported by default --- CHANGES | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGES b/CHANGES index 1ff594f53..92f73d7f6 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,24 @@ Version 5.27.0 * Updated CA bundle. +* Raven transports that have dependencies outside Python stdlib are no longer + imported by default, and must now be explicitly imported by the application. + The transports no longer imported by default are: + - raven.transport.eventlet.EventletHTTPTransport + - raven.transport.gevent.GeventedHTTPTransport + - raven.transport.requests.RequestsHTTPTransport + - raven.transport.twisted import TwistedHTTPTransport + - raven.transport.tornado import TornadoHTTPTransport + + If you really need to have those transports available, you need to explicitly + import them and register them, as early as possible. For example: + ``` + from raven.transport.eventlet import EventletHTTPTransport + from raven.transport.registry import default_transports + + default_transports.append(EventletHTTPTransport) + ``` + Version 5.26.0 -------------- From f3392260a2a50a0b5f2780acff86c28ead5b7a45 Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Wed, 14 Sep 2016 17:37:08 +0100 Subject: [PATCH 3/8] Remove commented out code --- raven/transport/__init__.py | 11 ----------- raven/transport/registry.py | 13 ------------- 2 files changed, 24 deletions(-) diff --git a/raven/transport/__init__.py b/raven/transport/__init__.py index 20728d08f..16836422c 100644 --- a/raven/transport/__init__.py +++ b/raven/transport/__init__.py @@ -8,14 +8,3 @@ # TODO: deprecate this namespace and force non-default (sync + threaded) to # manually import/register transports somehow from __future__ import absolute_import - -# from raven.transport.base import * # NOQA -# from raven.transport.eventlet import * # NOQA -# from raven.transport.exceptions import * # NOQA -# from raven.transport.gevent import * # NOQA -# from raven.transport.http import * # NOQA -# from raven.transport.requests import * # NOQA -# from raven.transport.registry import * # NOQA -# from raven.transport.twisted import * # NOQA -# from raven.transport.threaded import * # NOQA -# from raven.transport.tornado import * # NOQA diff --git a/raven/transport/registry.py b/raven/transport/registry.py index d1a1c8747..0439d1c35 100644 --- a/raven/transport/registry.py +++ b/raven/transport/registry.py @@ -7,16 +7,9 @@ """ from __future__ import absolute_import -# TODO(dcramer): we really should need to import all of these by default -# from raven.transport.eventlet import EventletHTTPTransport from raven.transport.exceptions import DuplicateScheme from raven.transport.http import HTTPTransport -# from raven.transport.gevent import GeventedHTTPTransport -# from raven.transport.requests import RequestsHTTPTransport from raven.transport.threaded import ThreadedHTTPTransport -from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport -# from raven.transport.twisted import TwistedHTTPTransport -# from raven.transport.tornado import TornadoHTTPTransport from raven.utils import urlparse @@ -74,10 +67,4 @@ def compute_scope(self, url, scope): default_transports = [ HTTPTransport, ThreadedHTTPTransport, - # GeventedHTTPTransport, - # TwistedHTTPTransport, - # RequestsHTTPTransport, - # ThreadedRequestsHTTPTransport, - # TornadoHTTPTransport, - # EventletHTTPTransport, ] From 55b8dad0a057a6da25bc6c4f2e4d7cfe1abdde7f Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Wed, 14 Sep 2016 18:42:58 +0100 Subject: [PATCH 4/8] Fix tests --- CHANGES | 23 +++++++++++++++---- conftest.py | 18 +++++++++++++++ raven/transport/__init__.py | 3 +++ tests/base/tests.py | 2 +- tests/contrib/django/tests.py | 2 +- .../requests/test_threaded_requests.py | 4 ++-- tests/transport/requests/tests.py | 2 +- tests/transport/threaded/tests.py | 2 +- 8 files changed, 45 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 92f73d7f6..fa5e3e3b7 100644 --- a/CHANGES +++ b/CHANGES @@ -9,16 +9,29 @@ Version 5.27.0 - raven.transport.eventlet.EventletHTTPTransport - raven.transport.gevent.GeventedHTTPTransport - raven.transport.requests.RequestsHTTPTransport - - raven.transport.twisted import TwistedHTTPTransport - - raven.transport.tornado import TornadoHTTPTransport + - raven.transport.threaded_requests.ThreadedRequestsHTTPTransport + - raven.transport.twisted.TwistedHTTPTransport + - raven.transport.tornado.TornadoHTTPTransport If you really need to have those transports available, you need to explicitly - import them and register them, as early as possible. For example: + import them and register them. For full compatibility: ``` from raven.transport.eventlet import EventletHTTPTransport - from raven.transport.registry import default_transports + from raven.transport.gevent import GeventedHTTPTransport + from raven.transport.requests import RequestsHTTPTransport + from raven.transport.twisted import TwistedHTTPTransport + from raven.transport.tornado import TornadoHTTPTransport + from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport + from raven.base import Client + + for transport in [EventletHTTPTransport, + GeventedHTTPTransport, + RequestsHTTPTransport, + ThreadedRequestsHTTPTransport, + TwistedHTTPTransport, + TornadoHTTPTransport]: + Client._registry.register_transport(transport) - default_transports.append(EventletHTTPTransport) ``` Version 5.26.0 diff --git a/conftest.py b/conftest.py index 55c641c3a..3243c75c2 100644 --- a/conftest.py +++ b/conftest.py @@ -2,6 +2,14 @@ import os.path import sys +from raven.transport.eventlet import EventletHTTPTransport +from raven.transport.gevent import GeventedHTTPTransport +from raven.transport.requests import RequestsHTTPTransport +from raven.transport.twisted import TwistedHTTPTransport +from raven.transport.tornado import TornadoHTTPTransport +from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport +from raven.base import Client + collect_ignore = [] if sys.version_info[0] > 2: @@ -82,3 +90,13 @@ def pytest_configure(config): }], ALLOWED_HOSTS=['*'], ) + + + +for transport in [EventletHTTPTransport, + GeventedHTTPTransport, + RequestsHTTPTransport, + ThreadedRequestsHTTPTransport, + TwistedHTTPTransport, + TornadoHTTPTransport]: + Client._registry.register_transport(transport) diff --git a/raven/transport/__init__.py b/raven/transport/__init__.py index 16836422c..0ab31e7fd 100644 --- a/raven/transport/__init__.py +++ b/raven/transport/__init__.py @@ -8,3 +8,6 @@ # TODO: deprecate this namespace and force non-default (sync + threaded) to # manually import/register transports somehow from __future__ import absolute_import + +from raven.transport.base import * # NOQA +from raven.transport.registry import * # NOQA diff --git a/tests/base/tests.py b/tests/base/tests.py index 83a124259..6f2338fd0 100644 --- a/tests/base/tests.py +++ b/tests/base/tests.py @@ -10,7 +10,7 @@ from raven.base import Client, ClientState from raven.exceptions import RateLimited -from raven.transport import AsyncTransport +from raven.transport.base import AsyncTransport from raven.transport.http import HTTPTransport from raven.utils.stacks import iter_stack_frames from raven.utils.testutils import TestCase diff --git a/tests/contrib/django/tests.py b/tests/contrib/django/tests.py index 3aa6b746d..33fb99fab 100644 --- a/tests/contrib/django/tests.py +++ b/tests/contrib/django/tests.py @@ -32,7 +32,7 @@ from raven.contrib.django.middleware.wsgi import Sentry from raven.contrib.django.templatetags.raven import sentry_public_dsn from raven.contrib.django.views import is_valid_origin -from raven.transport import HTTPTransport +from raven.transport.http import HTTPTransport from raven.utils.serializer import transform from django.test.client import Client as TestClient, ClientHandler as TestClientHandler diff --git a/tests/transport/requests/test_threaded_requests.py b/tests/transport/requests/test_threaded_requests.py index 6428061d4..99644fe3e 100644 --- a/tests/transport/requests/test_threaded_requests.py +++ b/tests/transport/requests/test_threaded_requests.py @@ -9,7 +9,7 @@ class DummyThreadedScheme(ThreadedRequestsHTTPTransport): def __init__(self, *args, **kwargs): - super(ThreadedRequestsHTTPTransport, self).__init__(*args, **kwargs) + super(DummyThreadedScheme, self).__init__(*args, **kwargs) self.events = [] self.send_delay = 0 @@ -26,7 +26,7 @@ def setUp(self): self.url = "threaded+requests+http://some_username:some_password@localhost:8143/1" self.client = Client(dsn=self.url) - @mock.patch('raven.transport.requests.post') + @mock.patch('requests.post') def test_does_send(self, send): self.client.captureMessage(message='foo') diff --git a/tests/transport/requests/tests.py b/tests/transport/requests/tests.py index 97bc48314..05a51929d 100644 --- a/tests/transport/requests/tests.py +++ b/tests/transport/requests/tests.py @@ -12,7 +12,7 @@ def setUp(self): dsn="requests+http://some_username:some_password@localhost:8143/1", ) - @mock.patch('raven.transport.requests.post') + @mock.patch('requests.post') def test_does_send(self, post): self.client.captureMessage(message='foo') self.assertEqual(post.call_count, 1) diff --git a/tests/transport/threaded/tests.py b/tests/transport/threaded/tests.py index f63dc71ef..1202ae9fa 100644 --- a/tests/transport/threaded/tests.py +++ b/tests/transport/threaded/tests.py @@ -12,7 +12,7 @@ class DummyThreadedScheme(ThreadedHTTPTransport): def __init__(self, *args, **kwargs): - super(ThreadedHTTPTransport, self).__init__(*args, **kwargs) + super(DummyThreadedScheme, self).__init__(*args, **kwargs) self.events = [] self.send_delay = 0 From 6550d8b86ef468ff3187c0d6686378471751cb5e Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Fri, 23 Sep 2016 19:02:52 +0100 Subject: [PATCH 5/8] Don't enable compatibility registration of all transports in tests. --- conftest.py | 10 ---------- tests/transport/requests/test_threaded_requests.py | 3 ++- tests/transport/requests/tests.py | 2 ++ tests/transport/tornado/tests.py | 10 +++++++--- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/conftest.py b/conftest.py index 3243c75c2..2ec38e9c3 100644 --- a/conftest.py +++ b/conftest.py @@ -90,13 +90,3 @@ def pytest_configure(config): }], ALLOWED_HOSTS=['*'], ) - - - -for transport in [EventletHTTPTransport, - GeventedHTTPTransport, - RequestsHTTPTransport, - ThreadedRequestsHTTPTransport, - TwistedHTTPTransport, - TornadoHTTPTransport]: - Client._registry.register_transport(transport) diff --git a/tests/transport/requests/test_threaded_requests.py b/tests/transport/requests/test_threaded_requests.py index 99644fe3e..756aa3aa0 100644 --- a/tests/transport/requests/test_threaded_requests.py +++ b/tests/transport/requests/test_threaded_requests.py @@ -24,7 +24,8 @@ def send_sync(self, data, headers, success_cb, failure_cb): class ThreadedTransportTest(TestCase): def setUp(self): self.url = "threaded+requests+http://some_username:some_password@localhost:8143/1" - self.client = Client(dsn=self.url) + self.client = Client(dsn=self.url, + transport=ThreadedRequestsHTTPTransport) @mock.patch('requests.post') def test_does_send(self, send): diff --git a/tests/transport/requests/tests.py b/tests/transport/requests/tests.py index 05a51929d..871282224 100644 --- a/tests/transport/requests/tests.py +++ b/tests/transport/requests/tests.py @@ -4,12 +4,14 @@ from raven.utils.testutils import TestCase from raven.base import Client +from raven.transport.requests import RequestsHTTPTransport class RequestsTransportTest(TestCase): def setUp(self): self.client = Client( dsn="requests+http://some_username:some_password@localhost:8143/1", + transport=RequestsHTTPTransport, ) @mock.patch('requests.post') diff --git a/tests/transport/tornado/tests.py b/tests/transport/tornado/tests.py index 351b4d4a4..87c4cd5aa 100644 --- a/tests/transport/tornado/tests.py +++ b/tests/transport/tornado/tests.py @@ -4,6 +4,7 @@ from raven.base import Client from tornado import gen, testing, httpclient +from raven.transport.tornado import TornadoHTTPTransport class TornadoTransportTests(testing.AsyncTestCase): @@ -23,7 +24,8 @@ def test_send(self, fake_client): fake = fake_client.return_value raven_client = Client( dsn="tornado+{0}?timeout={1}&verify_ssl={2}&ca_certs={3}". - format(url, timeout, verify_ssl, ca_certs)) + format(url, timeout, verify_ssl, ca_certs), + transport=TornadoHTTPTransport) raven_client.captureMessage(message="test") @@ -43,7 +45,8 @@ def test_send(self, fake_client): @testing.gen_test def test__sending_with_error_calls_error_callback(self): - c = Client(dsn='tornado+http://uver:pass@localhost:46754/1') + c = Client(dsn='tornado+http://uver:pass@localhost:46754/1', + transport=TornadoHTTPTransport) with mock.patch.object(Client, '_failed_send') as mock_failed: c.captureMessage(message='test') @@ -53,7 +56,8 @@ def test__sending_with_error_calls_error_callback(self): @testing.gen_test def test__sending_successfully_calls_success_callback(self): - c = Client(dsn='tornado+http://uver:pass@localhost:46754/1') + c = Client(dsn='tornado+http://uver:pass@localhost:46754/1', + transport=TornadoHTTPTransport) 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) From 049b98bece0c33e36bf1c2976e3be90c1a578f4a Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Fri, 23 Sep 2016 19:03:18 +0100 Subject: [PATCH 6/8] In CHANGES, recommend to use the `transport` kwarg of raven.Client() --- CHANGES | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index fa5e3e3b7..3b49707d8 100644 --- a/CHANGES +++ b/CHANGES @@ -14,23 +14,15 @@ Version 5.27.0 - raven.transport.tornado.TornadoHTTPTransport If you really need to have those transports available, you need to explicitly - import them and register them. For full compatibility: - ``` - from raven.transport.eventlet import EventletHTTPTransport - from raven.transport.gevent import GeventedHTTPTransport - from raven.transport.requests import RequestsHTTPTransport - from raven.transport.twisted import TwistedHTTPTransport - from raven.transport.tornado import TornadoHTTPTransport + import them and create a raven.Client() object passing a transport parameter. + Example: + + ```python from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport - from raven.base import Client - - for transport in [EventletHTTPTransport, - GeventedHTTPTransport, - RequestsHTTPTransport, - ThreadedRequestsHTTPTransport, - TwistedHTTPTransport, - TornadoHTTPTransport]: - Client._registry.register_transport(transport) + from raven import Client + + client = Client(dsn="threaded+requests+http://some_username:some_password@localhost:8143/1", + transport=ThreadedRequestsHTTPTransport) ``` From 11c58cd4772344b08de93b497422cfedea1bf8a9 Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Fri, 23 Sep 2016 22:40:43 +0100 Subject: [PATCH 7/8] tornado test can now use http:// as dsn instead of tornado+http:// --- tests/transport/tornado/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/transport/tornado/tests.py b/tests/transport/tornado/tests.py index 87c4cd5aa..7fe4273c8 100644 --- a/tests/transport/tornado/tests.py +++ b/tests/transport/tornado/tests.py @@ -45,7 +45,7 @@ def test_send(self, fake_client): @testing.gen_test def test__sending_with_error_calls_error_callback(self): - c = Client(dsn='tornado+http://uver:pass@localhost:46754/1', + c = Client(dsn='http://uver:pass@localhost:46754/1', transport=TornadoHTTPTransport) with mock.patch.object(Client, '_failed_send') as mock_failed: From 6125748e1a49e3279080e9ce7bb6c6d5208e3642 Mon Sep 17 00:00:00 2001 From: Gustavo Carneiro Date: Wed, 28 Sep 2016 12:33:17 +0100 Subject: [PATCH 8/8] Fix gevent transport unit test --- tests/transport/gevent/tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/transport/gevent/tests.py b/tests/transport/gevent/tests.py index 22c3e9000..fea2a3a7e 100644 --- a/tests/transport/gevent/tests.py +++ b/tests/transport/gevent/tests.py @@ -17,7 +17,8 @@ def setUp(self): gevent.monkey.patch_time() self.addCleanup(reload, time) self.client = Client( - dsn="gevent+http://some_username:some_password@localhost:8143/1", + dsn="http://some_username:some_password@localhost:8143/1", + transport=GeventedHTTPTransport, ) @mock.patch.object(GeventedHTTPTransport, '_done')