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