From 25f4800d62f339f81b09c894275a3af4b284fb62 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Wed, 19 Aug 2015 03:06:09 +0100 Subject: [PATCH] Port twisted.deferredruntest to Twisted >= 15.1.0 Twisted 15.1.0 removes the compatibility import of _LogObserver in twisted.trial.unittest. This is unfortunate for us, but it's what we get for using an internal interface. It at least still exists in twisted.trial._synctest, so we can get it from there. Twisted 15.2.0 adds the new twisted.logger framework, which requires a slight adjustment to run_with_log_observers. There's no longer a supported interface to get hold of all log observers, but since we're already using an internal interface (see above), what's one more? This passes "make check" with the current release, Twisted 15.3.0. --- testtools/deferredruntest.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/testtools/deferredruntest.py b/testtools/deferredruntest.py index c33e14a..04cdb0f 100644 --- a/testtools/deferredruntest.py +++ b/testtools/deferredruntest.py @@ -27,8 +27,15 @@ ) from twisted.internet import defer +try: + from twisted.logger import globalLogPublisher +except ImportError: + globalLogPublisher = None from twisted.python import log -from twisted.trial.unittest import _LogObserver +try: + from twisted.trial.unittest import _LogObserver +except ImportError: + from twisted.trial._synctest import _LogObserver class _DeferredRunTest(RunTest): @@ -53,9 +60,21 @@ def _run_user(self, function, *args): def run_with_log_observers(observers, function, *args, **kwargs): """Run 'function' with the given Twisted log observers.""" - real_observers = list(log.theLogPublisher.observers) + if globalLogPublisher is not None: + # Twisted >= 15.2.0, with the new twisted.logger framework. + # log.theLogPublisher.observers will only contain legacy observers; + # we need to look at globalLogPublisher._observers, which contains + # both legacy and modern observers, and add and remove them via + # globalLogPublisher. However, we must still add and remove the + # observers we want to run with via log.theLogPublisher, because + # _LogObserver may consider old keys and require them to be mapped. + publisher = globalLogPublisher + real_observers = list(publisher._observers) + else: + publisher = log.theLogPublisher + real_observers = list(publisher.observers) for observer in real_observers: - log.theLogPublisher.removeObserver(observer) + publisher.removeObserver(observer) for observer in observers: log.theLogPublisher.addObserver(observer) try: @@ -64,7 +83,7 @@ def run_with_log_observers(observers, function, *args, **kwargs): for observer in observers: log.theLogPublisher.removeObserver(observer) for observer in real_observers: - log.theLogPublisher.addObserver(observer) + publisher.addObserver(observer) # Observer of the Twisted log that we install during tests.