|
@@ -0,0 +1,63 @@
|
|
|
+import sys
|
|
|
+from warnings import WarningMessage
|
|
|
+
|
|
|
+
|
|
|
+class catch_warnings(object):
|
|
|
+
|
|
|
+ """A context manager that copies and restores the warnings filter upon
|
|
|
+ exiting the context.
|
|
|
+
|
|
|
+ The 'record' argument specifies whether warnings should be captured by a
|
|
|
+ custom implementation of warnings.showwarning() and be appended to a list
|
|
|
+ returned by the context manager. Otherwise None is returned by the context
|
|
|
+ manager. The objects appended to the list are arguments whose attributes
|
|
|
+ mirror the arguments to showwarning().
|
|
|
+
|
|
|
+ The 'module' argument is to specify an alternative module to the module
|
|
|
+ named 'warnings' and imported under that name. This argument is only
|
|
|
+ useful when testing the warnings module itself.
|
|
|
+
|
|
|
+ """
|
|
|
+
|
|
|
+ def __init__(self, record=False, module=None):
|
|
|
+ """Specify whether to record warnings and if an alternative module
|
|
|
+ should be used other than sys.modules['warnings'].
|
|
|
+
|
|
|
+ For compatibility with Python 3.0, please consider all arguments to be
|
|
|
+ keyword-only.
|
|
|
+
|
|
|
+ """
|
|
|
+ self._record = record
|
|
|
+ self._module = sys.modules['warnings'] if module is None else module
|
|
|
+ self._entered = False
|
|
|
+
|
|
|
+ def __repr__(self):
|
|
|
+ args = []
|
|
|
+ if self._record:
|
|
|
+ args.append("record=True")
|
|
|
+ if self._module is not sys.modules['warnings']:
|
|
|
+ args.append("module=%r" % self._module)
|
|
|
+ name = type(self).__name__
|
|
|
+ return "%s(%s)" % (name, ", ".join(args))
|
|
|
+
|
|
|
+ def __enter__(self):
|
|
|
+ if self._entered:
|
|
|
+ raise RuntimeError("Cannot enter %r twice" % self)
|
|
|
+ self._entered = True
|
|
|
+ self._filters = self._module.filters
|
|
|
+ self._module.filters = self._filters[:]
|
|
|
+ self._showwarning = self._module.showwarning
|
|
|
+ if self._record:
|
|
|
+ log = []
|
|
|
+ def showwarning(*args, **kwargs):
|
|
|
+ log.append(WarningMessage(*args, **kwargs))
|
|
|
+ self._module.showwarning = showwarning
|
|
|
+ return log
|
|
|
+ else:
|
|
|
+ return None
|
|
|
+
|
|
|
+ def __exit__(self, *exc_info):
|
|
|
+ if not self._entered:
|
|
|
+ raise RuntimeError("Cannot exit %r without entering first" % self)
|
|
|
+ self._module.filters = self._filters
|
|
|
+ self._module.showwarning = self._showwarning
|