Skip to content

Commit b22ab1f

Browse files
authored
Release v4.6.1
2 parents 563063f + 4de721b commit b22ab1f

25 files changed

+695
-499
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
Changelog
22
=========
33

4+
## v4.6.1 (2023-12-11)
5+
6+
### Bug fixes
7+
8+
* Avoid using deprecated `flask.__version__` attribute
9+
[#365](https://github.com/bugsnag/bugsnag-python/pull/365)
10+
* Ensure the session delivery queue is started regardless of `auto_capture_sessions` configuration
11+
[#367](https://github.com/bugsnag/bugsnag-python/pull/367)
12+
413
## v4.6.0 (2023-09-05)
514

615
### Enhancements

bugsnag/flask/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from bugsnag.wsgi import request_path
66
from bugsnag.legacy import _auto_leave_breadcrumb
77
from bugsnag.breadcrumbs import BreadcrumbType
8-
from bugsnag.utils import remove_query_from_url
8+
from bugsnag.utils import remove_query_from_url, get_package_version
99

1010

1111
__all__ = ('handle_exceptions',)
@@ -36,9 +36,16 @@ def add_flask_request_to_notification(event: bugsnag.Event):
3636

3737

3838
def handle_exceptions(app):
39-
middleware = bugsnag.configure().internal_middleware
40-
bugsnag.configure().runtime_versions['flask'] = flask.__version__
39+
configuration = bugsnag.configure()
40+
41+
version = get_package_version("flask")
42+
43+
if version is not None:
44+
configuration.runtime_versions["flask"] = version
45+
46+
middleware = configuration.internal_middleware
4147
middleware.before_notify(add_flask_request_to_notification)
48+
4249
flask.got_request_exception.connect(__log_exception, app)
4350
flask.request_started.connect(_on_request_started, app)
4451

bugsnag/notifier.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
_NOTIFIER_INFORMATION = {
22
'name': 'Python Bugsnag Notifier',
33
'url': 'https://github.com/bugsnag/bugsnag-python',
4-
'version': '4.6.0'
4+
'version': '4.6.1'
55
}

bugsnag/sessiontracker.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ def __init__(self, configuration):
3838
self.delivery_thread = None
3939

4040
def start_session(self):
41-
if not self.auto_sessions and self.config.auto_capture_sessions:
41+
if not self.auto_sessions:
4242
self.auto_sessions = True
4343
self.__start_delivery()
44+
4445
start_time = strftime('%Y-%m-%dT%H:%M:00', gmtime())
4546
new_session = {
4647
'id': uuid4().hex,

bugsnag/utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,3 +461,20 @@ def to_rfc3339(dt: datetime) -> str:
461461
int(dt.microsecond / 1000),
462462
_get_timezone_offset(dt)
463463
)
464+
465+
466+
def get_package_version(package_name: str) -> Optional[str]:
467+
try:
468+
from importlib import metadata
469+
470+
return metadata.version(package_name) # type: ignore
471+
except ImportError:
472+
try:
473+
import pkg_resources
474+
except ImportError:
475+
return None
476+
477+
try:
478+
return pkg_resources.get_distribution(package_name).version
479+
except pkg_resources.DistributionNotFound:
480+
return None

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
setup(
1616
name='bugsnag',
17-
version='4.6.0',
17+
version='4.6.1',
1818
description='Automatic error monitoring for django, flask, etc.',
1919
long_description=__doc__,
2020
author='Simon Maynard',

tests/conftest.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ def reset_breadcrumbs():
1414
@pytest.fixture
1515
def bugsnag_server():
1616
server = FakeBugsnagServer(wait_for_duplicate_requests=False)
17-
bugsnag.configure(endpoint=server.url, api_key='3874876376238728937')
17+
bugsnag.configure(
18+
endpoint=server.events_url,
19+
session_endpoint=server.sessions_url,
20+
api_key='3874876376238728937'
21+
)
1822

1923
yield server
2024

tests/integrations/conftest.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
@pytest.fixture
88
def bugsnag_server():
99
server = FakeBugsnagServer(wait_for_duplicate_requests=True)
10-
bugsnag.configure(endpoint=server.url, api_key='3874876376238728937')
10+
bugsnag.configure(
11+
endpoint=server.events_url,
12+
session_endpoint=server.sessions_url,
13+
api_key='3874876376238728937'
14+
)
1115

1216
yield server
1317

tests/integrations/test_asgi.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414
class TestASGIMiddleware(IntegrationTest):
1515
def setUp(self):
1616
super(TestASGIMiddleware, self).setUp()
17-
bugsnag.configure(endpoint=self.server.url,
18-
asynchronous=False,
19-
api_key='3874876376238728937',
20-
max_breadcrumbs=25)
17+
bugsnag.configure(
18+
endpoint=self.server.events_url,
19+
session_endpoint=self.server.sessions_url,
20+
asynchronous=False,
21+
api_key='3874876376238728937',
22+
max_breadcrumbs=25,
23+
)
2124

2225
def test_normal_http_operation(self):
2326
async def app(scope, recv, send):
@@ -46,7 +49,7 @@ async def index(req):
4649
self.assertRaises(ScaryException, lambda: app.get('/'))
4750
self.assertSentReportCount(1)
4851

49-
payload = self.server.received[0]['json_body']
52+
payload = self.server.events_received[0]['json_body']
5053
request = payload['events'][0]['metaData']['request']
5154
self.assertEqual('/', request['path'])
5255
self.assertEqual('GET', request['httpMethod'])
@@ -84,7 +87,7 @@ async def index(req):
8487
self.assertRaises(ScaryException, lambda: app.get('/'))
8588
self.assertSentReportCount(1)
8689

87-
payload = self.server.received[0]['json_body']
90+
payload = self.server.events_received[0]['json_body']
8891
environment = payload['events'][0]['metaData']['environment']
8992

9093
self.assertEqual('/', environment['path'])
@@ -116,7 +119,7 @@ async def index(req):
116119
)
117120
self.assertSentReportCount(1)
118121

119-
payload = self.server.received[0]['json_body']
122+
payload = self.server.events_received[0]['json_body']
120123
headers = payload['events'][0]['metaData']['request']['headers']
121124

122125
self.assertEqual('[FILTERED]', headers['authorization'])
@@ -130,7 +133,7 @@ async def app(scope, recv, send):
130133
self.assertRaises(ScaryException, lambda: app.get('/'))
131134
self.assertSentReportCount(1)
132135

133-
payload = self.server.received[0]['json_body']
136+
payload = self.server.events_received[0]['json_body']
134137
request = payload['events'][0]['metaData']['request']
135138
self.assertEqual('/', request['path'])
136139
self.assertEqual('GET', request['httpMethod'])
@@ -167,7 +170,7 @@ async def index(req):
167170
self.assertRaises(ScaryException, lambda: app.get('/'))
168171
self.assertSentReportCount(1)
169172

170-
payload = self.server.received[0]['json_body']
173+
payload = self.server.events_received[0]['json_body']
171174
metadata = payload['events'][0]['metaData']
172175
request = metadata['request']
173176
self.assertEqual('/', request['path'])
@@ -202,7 +205,7 @@ async def app(scope, receive, send):
202205

203206
self.assertSentReportCount(1)
204207

205-
payload = self.server.received[0]['json_body']
208+
payload = self.server.events_received[0]['json_body']
206209
metadata = payload['events'][0]['metaData']
207210
request = metadata['request']
208211
self.assertEqual('/', request['path'])
@@ -238,7 +241,7 @@ async def index(req):
238241
)
239242
self.assertSentReportCount(1)
240243

241-
payload = self.server.received[0]['json_body']
244+
payload = self.server.events_received[0]['json_body']
242245
request = payload['events'][0]['metaData']['request']
243246
self.assertEqual(
244247
'http://testserver/path?password=[FILTERED]',
@@ -272,7 +275,7 @@ async def index(req):
272275
)
273276
self.assertSentReportCount(1)
274277

275-
payload = self.server.received[0]['json_body']
278+
payload = self.server.events_received[0]['json_body']
276279
request = payload['events'][0]['metaData']['request']
277280
self.assertEqual('/', request['path'])
278281
self.assertEqual('GET', request['httpMethod'])
@@ -316,7 +319,7 @@ async def index(req):
316319

317320
assert self.sent_report_count == 1
318321

319-
payload = self.server.received[0]['json_body']
322+
payload = self.server.events_received[0]['json_body']
320323

321324
print(payload)
322325
assert len(payload['events'][0]['exceptions']) == 2
@@ -364,7 +367,7 @@ async def index(req):
364367

365368
assert self.sent_report_count == 1
366369

367-
payload = self.server.received[0]['json_body']
370+
payload = self.server.events_received[0]['json_body']
368371
exception = payload['events'][0]['exceptions'][0]
369372
feature_flags = payload['events'][0]['featureFlags']
370373

@@ -383,7 +386,7 @@ async def index(req):
383386

384387
assert self.sent_report_count == 2
385388

386-
payload = self.server.received[1]['json_body']
389+
payload = self.server.events_received[1]['json_body']
387390
feature_flags = payload['events'][0]['featureFlags']
388391

389392
assert feature_flags == [
@@ -396,7 +399,7 @@ async def index(req):
396399

397400
assert self.sent_report_count == 3
398401

399-
payload = self.server.received[2]['json_body']
402+
payload = self.server.events_received[2]['json_body']
400403
feature_flags = payload['events'][0]['featureFlags']
401404

402405
assert feature_flags == []

tests/integrations/test_bottle.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@
1010
class TestBottle(IntegrationTest):
1111
def setUp(self):
1212
super(TestBottle, self).setUp()
13-
bugsnag.configure(endpoint=self.server.url,
14-
session_endpoint=self.server.url,
15-
auto_capture_sessions=False,
16-
api_key='3874876376238728937',
17-
asynchronous=False)
13+
bugsnag.configure(
14+
endpoint=self.server.events_url,
15+
session_endpoint=self.server.sessions_url,
16+
api_key='3874876376238728937',
17+
asynchronous=False,
18+
)
1819

1920
def test_routing_error(self):
2021
@route('/beans')
@@ -26,8 +27,8 @@ def index():
2627
app = TestApp(BugsnagMiddleware(app))
2728

2829
self.assertRaises(Exception, lambda: app.get('/beans?password=123'))
29-
self.assertEqual(1, len(self.server.received))
30-
payload = self.server.received[0]['json_body']
30+
self.assertEqual(1, len(self.server.events_received))
31+
payload = self.server.events_received[0]['json_body']
3132
event = payload['events'][0]
3233
self.assertTrue(event['unhandled'])
3334
self.assertEqual(event['context'], 'GET /beans')
@@ -54,8 +55,8 @@ def index():
5455
app = TestApp(BugsnagMiddleware(app))
5556

5657
self.assertRaises(Exception, lambda: app.get('/beans'))
57-
self.assertEqual(1, len(self.server.received))
58-
payload = self.server.received[0]['json_body']
58+
self.assertEqual(1, len(self.server.events_received))
59+
payload = self.server.events_received[0]['json_body']
5960
metadata = payload['events'][0]['metaData']
6061
self.assertEqual(metadata['environment']['PATH_INFO'], '/beans')
6162

@@ -69,9 +70,9 @@ def index(variety):
6970
app = TestApp(BugsnagMiddleware(app))
7071

7172
self.assertRaises(Exception, lambda: app.get('/berries/red'))
72-
self.assertEqual(1, len(self.server.received))
73+
self.assertEqual(1, len(self.server.events_received))
7374

74-
payload = self.server.received[0]['json_body']
75+
payload = self.server.events_received[0]['json_body']
7576
event = payload['events'][0]
7677
self.assertTrue(event['unhandled'])
7778
self.assertEqual(event['context'], 'GET /berries/red')
@@ -112,7 +113,7 @@ def index():
112113

113114
assert self.sent_report_count == 1
114115

115-
payload = self.server.received[0]['json_body']
116+
payload = self.server.events_received[0]['json_body']
116117
exception = payload['events'][0]['exceptions'][0]
117118
feature_flags = payload['events'][0]['featureFlags']
118119

@@ -131,7 +132,7 @@ def index():
131132

132133
assert self.sent_report_count == 2
133134

134-
payload = self.server.received[1]['json_body']
135+
payload = self.server.events_received[1]['json_body']
135136
feature_flags = payload['events'][0]['featureFlags']
136137

137138
assert feature_flags == [
@@ -144,7 +145,7 @@ def index():
144145

145146
assert self.sent_report_count == 3
146147

147-
payload = self.server.received[2]['json_body']
148+
payload = self.server.events_received[2]['json_body']
148149
feature_flags = payload['events'][0]['featureFlags']
149150

150151
assert feature_flags == []

0 commit comments

Comments
 (0)