summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-07-30 12:50:38 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-07-30 12:50:38 -0400
commit5a86dba402d6d20aa70b8c6152a5a0564b896b4b (patch)
tree66856e4081c0b969606e6cae7937a832b988aa4e
parent0bf33068f43c75cdaac3bf25cf918847f07bf330 (diff)
downloadsqlalchemy-5a86dba402d6d20aa70b8c6152a5a0564b896b4b.tar.gz
- workaround removal of nested() in py3k
-rw-r--r--lib/sqlalchemy/util/__init__.py2
-rw-r--r--lib/sqlalchemy/util/compat.py34
-rw-r--r--test/engine/test_execute.py3
3 files changed, 37 insertions, 2 deletions
diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py
index a8b823208..15b2ac38e 100644
--- a/lib/sqlalchemy/util/__init__.py
+++ b/lib/sqlalchemy/util/__init__.py
@@ -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
diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py
index 7f2238a13..972fda667 100644
--- a/lib/sqlalchemy/util/compat.py
+++ b/lib/sqlalchemy/util/compat.py
@@ -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])
diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py
index 2d2086d5f..291aee2f3 100644
--- a/test/engine/test_execute.py
+++ b/test/engine/test_execute.py
@@ -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