diff --git a/bugsnag/configuration.py b/bugsnag/configuration.py index df5604fc..54b732a1 100644 --- a/bugsnag/configuration.py +++ b/bugsnag/configuration.py @@ -273,6 +273,25 @@ def delivery(self): def delivery(self, value): if hasattr(value, 'deliver') and callable(value.deliver): self._delivery = value + + # deliver_sessions is _technically_ optional in that if you disable + # session tracking it will never be called + # this should be made mandatory in the next major release + if ( + hasattr(value, 'deliver_sessions') and + callable(value.deliver_sessions) + ): + parameter_names = value.deliver_sessions.__code__.co_varnames + + if 'options' not in parameter_names: + warnings.warn( + 'delivery.deliver_sessions should accept an ' + + '"options" parameter to allow for synchronous ' + + 'delivery, sessions may be lost when the process ' + + 'exits', + DeprecationWarning + ) + else: message = ('delivery should implement Delivery interface, got ' + '{0}. This will be an error in a future release.') diff --git a/tests/test_configuration.py b/tests/test_configuration.py index d8cb82bb..03266940 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -195,6 +195,13 @@ class BadDelivery(object): def deliv(self, *args, **kwargs): pass + class OkDelivery: + def deliver(self, *args, **kwargs): + pass + + def deliver_sessions(self, config, payload): + pass + class GoodDelivery(object): def deliver(self, *args, **kwargs): pass @@ -213,6 +220,20 @@ def deliver(self, *args, **kwargs): assert len(record) == 1 assert c.delivery == good + with pytest.warns(DeprecationWarning) as record: + ok = OkDelivery() + + c.configure(delivery=ok) + + assert len(record) == 1 + assert str(record[0].message) == ( + 'delivery.deliver_sessions should accept an "options" ' + + 'parameter to allow for synchronous delivery, sessions ' + + 'may be lost when the process exits' + ) + + assert c.delivery == ok + def test_validate_hostname(self): c = Configuration() with pytest.warns(RuntimeWarning) as record: