import warnings

# The warnings module isn't easily tested, because it relies on module
# globals to store configuration information.  We need to extract the
# current settings to avoid bashing them while running tests.

_filters = []
_showwarning = None

def showwarning(message, category, filename, lineno, file=None):
    i = filename.find("Lib/")
    filename = filename[i:]
    print "%s:%s: %s: %s" % (filename, lineno, category.__name__, message)

def monkey():
    global _filters, _showwarning
    _filters = warnings.filters[:]
    _showwarning = warnings.showwarning
    warnings.showwarning = showwarning

def unmonkey():
    warnings.filters = _filters[:]
    warnings.showwarning = _showwarning

def test():
    for item in warnings.filters:
        print (item[0], item[1] is None, item[2].__name__, item[3] is None,
               item[4])
    hello = "hello world"
    for i in range(4):
        warnings.warn(hello)
    warnings.warn(hello, UserWarning)
    warnings.warn(hello, DeprecationWarning)
    for i in range(3):
        warnings.warn(hello)
    warnings.filterwarnings("error", "", Warning, "", 0)
    try:
        warnings.warn(hello)
    except Exception, msg:
        print "Caught", msg.__class__.__name__ + ":", msg
    else:
        print "No exception"
    warnings.resetwarnings()
    try:
        warnings.filterwarnings("booh", "", Warning, "", 0)
    except Exception, msg:
        print "Caught", msg.__class__.__name__ + ":", msg
    else:
        print "No exception"

monkey()
test()
unmonkey()
