Make ObservableDeferred.observe() always return deferred.

This makes it easier to use in an async/await world.

Also fixes a bug where cache descriptors would occaisonally return a raw
value rather than a deferred.
This commit is contained in:
Erik Johnston 2019-10-30 11:35:46 +00:00
parent 46c12918ad
commit 326b3dace7
3 changed files with 5 additions and 8 deletions

View file

@ -86,11 +86,8 @@ class ObservableDeferred(object):
deferred.addCallbacks(callback, errback) deferred.addCallbacks(callback, errback)
def observe(self): def observe(self) -> defer.Deferred:
"""Observe the underlying deferred. """Observe the underlying deferred.
Can return either a deferred if the underlying deferred is still pending
(or has failed), or the actual value. Callers may need to use maybeDeferred.
""" """
if not self._result: if not self._result:
d = defer.Deferred() d = defer.Deferred()
@ -105,7 +102,7 @@ class ObservableDeferred(object):
return d return d
else: else:
success, res = self._result success, res = self._result
return res if success else defer.fail(res) return defer.succeed(res) if success else defer.fail(res)
def observers(self): def observers(self):
return self._observers return self._observers

View file

@ -197,7 +197,7 @@ class CacheDecoratorTestCase(unittest.TestCase):
a.func.prefill(("foo",), ObservableDeferred(d)) a.func.prefill(("foo",), ObservableDeferred(d))
self.assertEquals(a.func("foo"), d.result) self.assertEquals(a.func("foo").result, d.result)
self.assertEquals(callcount[0], 0) self.assertEquals(callcount[0], 0)
@defer.inlineCallbacks @defer.inlineCallbacks

View file

@ -310,14 +310,14 @@ class DescriptorTestCase(unittest.TestCase):
obj.mock.return_value = ["spam", "eggs"] obj.mock.return_value = ["spam", "eggs"]
r = obj.fn(1, 2) r = obj.fn(1, 2)
self.assertEqual(r, ["spam", "eggs"]) self.assertEqual(r.result, ["spam", "eggs"])
obj.mock.assert_called_once_with(1, 2) obj.mock.assert_called_once_with(1, 2)
obj.mock.reset_mock() obj.mock.reset_mock()
# a call with different params should call the mock again # a call with different params should call the mock again
obj.mock.return_value = ["chips"] obj.mock.return_value = ["chips"]
r = obj.fn(1, 3) r = obj.fn(1, 3)
self.assertEqual(r, ["chips"]) self.assertEqual(r.result, ["chips"])
obj.mock.assert_called_once_with(1, 3) obj.mock.assert_called_once_with(1, 3)
obj.mock.reset_mock() obj.mock.reset_mock()