From da9e8be876fe7ad43d169792b5c09f22417e632d Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 2 Sep 2014 14:22:28 -0400 Subject: [PATCH] - backport the expects_warning() context manager from 1.0 --- lib/sqlalchemy/testing/assertions.py | 45 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py index 79411af7e9..c15b95d059 100644 --- a/lib/sqlalchemy/testing/assertions.py +++ b/lib/sqlalchemy/testing/assertions.py @@ -24,6 +24,28 @@ from .util import fail import contextlib +@contextlib.contextmanager +def expect_warnings(*messages): + """Context manager to expect warnings with the given messages.""" + + filters = [dict(action='ignore', + category=sa_exc.SAPendingDeprecationWarning)] + if not messages: + filters.append(dict(action='ignore', + category=sa_exc.SAWarning)) + else: + filters.extend(dict(action='ignore', + message=message, + category=sa_exc.SAWarning) + for message in messages) + for f in filters: + warnings.filterwarnings(**f) + try: + yield + finally: + resetwarnings() + + def emits_warning(*messages): """Mark a test as emitting a warning. @@ -31,31 +53,10 @@ def emits_warning(*messages): strings; these will be matched to the root of the warning description by warnings.filterwarnings(). """ - # TODO: it would be nice to assert that a named warning was - # emitted. should work with some monkeypatching of warnings, - # and may work on non-CPython if they keep to the spirit of - # warnings.showwarning's docstring. - # - update: jython looks ok, it uses cpython's module - @decorator def decorate(fn, *args, **kw): - # todo: should probably be strict about this, too - filters = [dict(action='ignore', - category=sa_exc.SAPendingDeprecationWarning)] - if not messages: - filters.append(dict(action='ignore', - category=sa_exc.SAWarning)) - else: - filters.extend(dict(action='ignore', - message=message, - category=sa_exc.SAWarning) - for message in messages) - for f in filters: - warnings.filterwarnings(**f) - try: + with expect_warnings(*messages): return fn(*args, **kw) - finally: - resetwarnings() return decorate -- 2.47.3