]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- workaround removal of nested() in py3k
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 30 Jul 2014 16:50:38 +0000 (12:50 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 30 Jul 2014 16:50:38 +0000 (12:50 -0400)
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/compat.py
test/engine/test_execute.py

index a8b823208fc3838db49d35b241959ebfafd3e966..15b2ac38eec0ee8cdde0832a87cc51e2aec995d1 100644 (file)
@@ -9,7 +9,7 @@ from .compat import callable, cmp, reduce,  \
     threading, py3k, py33, py2k, jython, pypy, cpython, win32, \
     pickle, dottedgetter, parse_qsl, namedtuple, next, reraise, \
     raise_from_cause, text_type, safe_kwarg, string_types, int_types, \
-    binary_type, \
+    binary_type, nested, \
     quote_plus, with_metaclass, print_, itertools_filterfalse, u, ue, b,\
     unquote_plus, unquote, b64decode, b64encode, byte_buffer, itertools_filter,\
     iterbytes, StringIO, inspect_getargspec, zip_longest
index 7f2238a13d3e45301c341db285b1d99a3edfe474..972fda66730739d38bd12034af27978c4e25606e 100644 (file)
@@ -226,3 +226,37 @@ def with_metaclass(meta, *bases):
                 return type.__new__(cls, name, (), d)
             return meta(name, bases, d)
     return metaclass('temporary_class', None, {})
+
+
+from contextlib import contextmanager
+
+try:
+    from contextlib import nested
+except ImportError:
+    # removed in py3k, credit to mitsuhiko for
+    # workaround
+
+    @contextmanager
+    def nested(*managers):
+        exits = []
+        vars = []
+        exc = (None, None, None)
+        try:
+            for mgr in managers:
+                exit = mgr.__exit__
+                enter = mgr.__enter__
+                vars.append(enter())
+                exits.append(exit)
+            yield vars
+        except:
+            exc = sys.exc_info()
+        finally:
+            while exits:
+                exit = exits.pop()
+                try:
+                    if exit(*exc):
+                        exc = (None, None, None)
+                except:
+                    exc = sys.exc_info()
+            if exc != (None, None, None):
+                reraise(exc[0], exc[1], exc[2])
index 2d2086d5f93d6dae0e81db3a42086cd5b7c4c78c..291aee2f34923b49271898cf9473a04382d84485 100644 (file)
@@ -19,7 +19,8 @@ from sqlalchemy.engine import result as _result, default
 from sqlalchemy.engine.base import Engine
 from sqlalchemy.testing import fixtures
 from sqlalchemy.testing.mock import Mock, call, patch
-from contextlib import contextmanager, nested
+from contextlib import contextmanager
+from sqlalchemy.util import nested
 import logging.handlers  # needed for logging tests to work correctly
 
 users, metadata, users_autoinc = None, None, None