Skip to content

Commit

Permalink
Use new handle_exception hook, refs #1
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed Jul 18, 2022
1 parent 46b8280 commit 5871b9f
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 20 deletions.
25 changes: 24 additions & 1 deletion datasette_sentry.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ def asgi_wrapper(datasette):
config = datasette.plugin_config("datasette-sentry") or {}
dsn = config.get("dsn")
if dsn is not None:
sentry_sdk.init(dsn=dsn)
kwargs = dict(dsn=dsn)
if config.get("capture_events"):
kwargs["transport"] = CaptureTransport(datasette)
sentry_sdk.init(**kwargs)

def wrap_with_class(app):
if dsn is None:
Expand All @@ -17,3 +20,23 @@ def wrap_with_class(app):
return SentryAsgiMiddleware(app)

return wrap_with_class


@hookimpl
def handle_exception(exception):
sentry_sdk.capture_exception(exception)


class CaptureTransport(sentry_sdk.transport.Transport):
"Transport that captures evenst in a list, mainly for testing"

def __init__(self, datasette):
self.datasette = datasette
self.datasette._datasette_sentry_events = []
self.datasette._datasette_sentry_envelopes = []

def capture_event(self, event):
self.datasette._datasette_sentry_events.append(event)

def capture_envelope(self, envelope):
self.datasette._datasette_sentry_envelopes.append(envelope)
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ def get_long_description():
version=VERSION,
entry_points={"datasette": ["sentry = datasette_sentry"]},
py_modules=["datasette_sentry"],
install_requires=["sentry-sdk"],
extras_require={"test": ["pytest", "datasette"]},
install_requires=["sentry-sdk", "datasette>=0.62a1"],
extras_require={"test": ["pytest", "pytest-asyncio"]},
classifiers=[
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3.7",
Expand Down
69 changes: 52 additions & 17 deletions test_datasette_sentry.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,61 @@
from datasette_sentry import asgi_wrapper
from datasette.app import Datasette
from datasette import hookimpl
from datasette.plugins import pm
import sentry_sdk
import functools


class FakeDatasette:
def __init__(self, config):
self.config = config

def plugin_config(self, name):
assert "datasette-sentry" == name
return self.config
import pytest


def test_asgi_wrapper():
app = object()
wrapper = asgi_wrapper(FakeDatasette({"dsn": "https://demo@sentry.io/1234"}))
wrapped = wrapper(app)
assert app == wrapped.app
ds = Datasette(
metadata={
"plugins": {"datasette-sentry": {"dsn": "https://demo@sentry.io/1234"}}
}
)
wrapper = asgi_wrapper(ds)
wrapped = wrapper(ds)
assert ds == wrapped.app
assert isinstance(wrapped, sentry_sdk.integrations.asgi.SentryAsgiMiddleware)


def test_not_wrapped_if_no_configuration():
app = object()
wrapper = asgi_wrapper(FakeDatasette({}))
assert app == wrapper(app)
ds = Datasette()
wrapper = asgi_wrapper(ds)
assert ds == wrapper(ds)


@pytest.mark.asyncio
@pytest.mark.parametrize("configured", (True, False))
async def test_logs_errors_to_sentry(configured):
class ErrorPlugin:
__name__ = "ErrorPlugin"

@hookimpl
def register_routes(self):
return (("/error", lambda: 1 / 0),)

pm.register(ErrorPlugin(), name="undo")
try:
# Rest of test goes here
if configured:
ds = Datasette(
metadata={
"plugins": {
"datasette-sentry": {
"dsn": "https://demo@sentry.io/1234",
"capture_events": True,
}
}
}
)
else:
ds = Datasette()
response = await ds.client.get("/error")
assert response.status_code == 500
if configured:
assert len(ds._datasette_sentry_events) == 1
else:
assert not hasattr(ds, "_datasette_sentry_events")
assert not hasattr(ds, "_datasette_sentry_envelopes")
finally:
pm.unregister(name="undo")

0 comments on commit 5871b9f

Please sign in to comment.