python/mock-1.0.0/tests/support_with.py

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/python/mock-1.0.0/tests/support_with.py	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,93 @@
     1.4 +from __future__ import with_statement
     1.5 +
     1.6 +import sys
     1.7 +
     1.8 +__all__ = ['nested', 'catch_warnings', 'examine_warnings']
     1.9 +
    1.10 +
    1.11 +try:
    1.12 +    from contextlib import nested
    1.13 +except ImportError:
    1.14 +    from contextlib import contextmanager
    1.15 +    @contextmanager
    1.16 +    def nested(*managers):
    1.17 +        exits = []
    1.18 +        vars = []
    1.19 +        exc = (None, None, None)
    1.20 +        try:
    1.21 +            for mgr in managers:
    1.22 +                exit = mgr.__exit__
    1.23 +                enter = mgr.__enter__
    1.24 +                vars.append(enter())
    1.25 +                exits.append(exit)
    1.26 +            yield vars
    1.27 +        except:
    1.28 +            exc = sys.exc_info()
    1.29 +        finally:
    1.30 +            while exits:
    1.31 +                exit = exits.pop()
    1.32 +                try:
    1.33 +                    if exit(*exc):
    1.34 +                        exc = (None, None, None)
    1.35 +                except:
    1.36 +                    exc = sys.exc_info()
    1.37 +            if exc != (None, None, None):
    1.38 +                raise exc[1]
    1.39 +
    1.40 +# copied from Python 2.6
    1.41 +try:
    1.42 +    from warnings import catch_warnings
    1.43 +except ImportError:
    1.44 +    class catch_warnings(object):
    1.45 +        def __init__(self, record=False, module=None):
    1.46 +            self._record = record
    1.47 +            self._module = sys.modules['warnings']
    1.48 +            self._entered = False
    1.49 +
    1.50 +        def __repr__(self):
    1.51 +            args = []
    1.52 +            if self._record:
    1.53 +                args.append("record=True")
    1.54 +            name = type(self).__name__
    1.55 +            return "%s(%s)" % (name, ", ".join(args))
    1.56 +
    1.57 +        def __enter__(self):
    1.58 +            if self._entered:
    1.59 +                raise RuntimeError("Cannot enter %r twice" % self)
    1.60 +            self._entered = True
    1.61 +            self._filters = self._module.filters
    1.62 +            self._module.filters = self._filters[:]
    1.63 +            self._showwarning = self._module.showwarning
    1.64 +            if self._record:
    1.65 +                log = []
    1.66 +                def showwarning(*args, **kwargs):
    1.67 +                    log.append(WarningMessage(*args, **kwargs))
    1.68 +                self._module.showwarning = showwarning
    1.69 +                return log
    1.70 +            else:
    1.71 +                return None
    1.72 +
    1.73 +        def __exit__(self, *exc_info):
    1.74 +            if not self._entered:
    1.75 +                raise RuntimeError("Cannot exit %r without entering first" % self)
    1.76 +            self._module.filters = self._filters
    1.77 +            self._module.showwarning = self._showwarning
    1.78 +
    1.79 +    class WarningMessage(object):
    1.80 +        _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file",
    1.81 +                            "line")
    1.82 +        def __init__(self, message, category, filename, lineno, file=None,
    1.83 +                        line=None):
    1.84 +            local_values = locals()
    1.85 +            for attr in self._WARNING_DETAILS:
    1.86 +                setattr(self, attr, local_values[attr])
    1.87 +            self._category_name = None
    1.88 +            if category.__name__:
    1.89 +                self._category_name = category.__name__
    1.90 +
    1.91 +
    1.92 +def examine_warnings(func):
    1.93 +    def wrapper():
    1.94 +        with catch_warnings(record=True) as ws:
    1.95 +            func(ws)
    1.96 +    return wrapper

mercurial