Bladeren bron

contextmanagers that needs finally

Ask Solem 12 jaren geleden
bovenliggende
commit
60a109742c
4 gewijzigde bestanden met toevoegingen van 70 en 48 verwijderingen
  1. 10 6
      celery/tests/backends/test_cache.py
  2. 4 2
      celery/tests/tasks/test_chord.py
  3. 4 3
      celery/tests/tasks/test_http.py
  4. 52 37
      celery/tests/utils.py

+ 10 - 6
celery/tests/backends/test_cache.py

@@ -135,9 +135,11 @@ class MockCacheMixin(object):
         memcache.Client = MemcachedClient
         memcache.Client.__module__ = memcache.__name__
         prev, sys.modules['memcache'] = sys.modules.get('memcache'), memcache
-        yield True
-        if prev is not None:
-            sys.modules['memcache'] = prev
+        try:
+            yield True
+        finally:
+            if prev is not None:
+                sys.modules['memcache'] = prev
 
     @contextmanager
     def mock_pylibmc(self):
@@ -146,9 +148,11 @@ class MockCacheMixin(object):
         pylibmc.Client.__module__ = pylibmc.__name__
         prev = sys.modules.get('pylibmc')
         sys.modules['pylibmc'] = pylibmc
-        yield True
-        if prev is not None:
-            sys.modules['pylibmc'] = prev
+        try:
+            yield True
+        finally:
+            if prev is not None:
+                sys.modules['pylibmc'] = prev
 
 
 class test_get_best_memcache(Case, MockCacheMixin):

+ 4 - 2
celery/tests/tasks/test_chord.py

@@ -43,8 +43,10 @@ def patch_unlock_retry():
     unlock = current_app.tasks['celery.chord_unlock']
     retry = Mock()
     prev, unlock.retry = unlock.retry, retry
-    yield unlock, retry
-    unlock.retry = prev
+    try:
+        yield unlock, retry
+    finally:
+        unlock.retry = prev
 
 
 class test_unlock_chord_task(AppCase):

+ 4 - 3
celery/tests/tasks/test_http.py

@@ -30,9 +30,10 @@ def mock_urlopen(response_method):
 
     urllib2.urlopen = _mocked
 
-    yield True
-
-    urllib2.urlopen = urlopen
+    try:
+        yield True
+    finally:
+        urllib2.urlopen = urlopen
 
 
 def _response(res):

+ 52 - 37
celery/tests/utils.py

@@ -226,9 +226,10 @@ def wrap_logger(logger, loglevel=logging.ERROR):
     siohandler = logging.StreamHandler(sio)
     logger.handlers = [siohandler]
 
-    yield sio
-
-    logger.handlers = old_handlers
+    try:
+        yield sio
+    finally:
+        logger.handlers = old_handlers
 
 
 @contextmanager
@@ -237,10 +238,10 @@ def eager_tasks():
 
     prev = app.conf.CELERY_ALWAYS_EAGER
     app.conf.CELERY_ALWAYS_EAGER = True
-
-    yield True
-
-    app.conf.CELERY_ALWAYS_EAGER = prev
+    try:
+        yield True
+    finally:
+        app.conf.CELERY_ALWAYS_EAGER = prev
 
 
 def with_eager_tasks(fun):
@@ -378,8 +379,10 @@ def mask_modules(*modnames):
             return realimport(name, *args, **kwargs)
 
     builtins.__import__ = myimp
-    yield True
-    builtins.__import__ = realimport
+    try:
+        yield True
+    finally:
+        builtins.__import__ = realimport
 
 
 @contextmanager
@@ -390,10 +393,11 @@ def override_stdouts():
     sys.stdout = sys.__stdout__ = mystdout
     sys.stderr = sys.__stderr__ = mystderr
 
-    yield mystdout, mystderr
-
-    sys.stdout = sys.__stdout__ = prev_out
-    sys.stderr = sys.__stderr__ = prev_err
+    try:
+        yield mystdout, mystderr
+    finally:
+        sys.stdout = sys.__stdout__ = prev_out
+        sys.stderr = sys.__stderr__ = prev_err
 
 
 def patch(module, name, mocked):
@@ -424,14 +428,16 @@ def replace_module_value(module, name, value=None):
             delattr(module, name)
         except AttributeError:
             pass
-    yield
-    if prev is not None:
-        setattr(sys, name, prev)
-    if not has_prev:
-        try:
-            delattr(module, name)
-        except AttributeError:
-            pass
+    try:
+        yield
+    finally:
+        if prev is not None:
+            setattr(sys, name, prev)
+        if not has_prev:
+            try:
+                delattr(module, name)
+            except AttributeError:
+                pass
 pypy_version = partial(
     replace_module_value, sys, 'pypy_version_info',
 )
@@ -443,15 +449,19 @@ platform_pyimp = partial(
 @contextmanager
 def sys_platform(value):
     prev, sys.platform = sys.platform, value
-    yield
-    sys.platform = prev
+    try:
+        yield
+    finally:
+        sys.platform = prev
 
 
 @contextmanager
 def reset_modules(*modules):
     prev = dict((k, sys.modules.pop(k)) for k in modules if k in sys.modules)
-    yield
-    sys.modules.update(prev)
+    try:
+        yield
+    finally:
+        sys.modules.update(prev)
 
 
 @contextmanager
@@ -459,12 +469,14 @@ def patch_modules(*modules):
     prev = {}
     for mod in modules:
         prev[mod], sys.modules[mod] = sys.modules[mod], ModuleType(mod)
-    yield
-    for name, mod in prev.iteritems():
-        if mod is None:
-            sys.modules.pop(name, None)
-        else:
-            sys.modules[name] = mod
+    try:
+        yield
+    finally:
+        for name, mod in prev.iteritems():
+            if mod is None:
+                sys.modules.pop(name, None)
+            else:
+                sys.modules[name] = mod
 
 
 @contextmanager
@@ -509,8 +521,10 @@ def mock_context(mock, typ=Mock):
             raise x[0], x[1], x[2]
     context.__exit__.side_effect = on_exit
     context.__enter__.return_value = context
-    yield context
-    context.reset()
+    try:
+        yield context
+    finally:
+        context.reset()
 
 
 @contextmanager
@@ -541,10 +555,11 @@ def patch_settings(app=None, **config):
             pass
         setattr(app.conf, key, value)
 
-    yield app.conf
-
-    for key, value in prev.iteritems():
-        setattr(app.conf, key, value)
+    try:
+        yield app.conf
+    finally:
+        for key, value in prev.iteritems():
+            setattr(app.conf, key, value)
 
 
 @contextmanager