# @GPL_HEADER_START
# Use of the RAVE and related source code is subject to the terms
# of the following licenses:
# 
# GNU Public License (GPL) Rights pursuant to Version 2, June 1991
# Government Purpose License Rights (GPLR) pursuant to DFARS 252.225-7013
# 
# NO WARRANTY
# 
# ANY INFORMATION, MATERIALS, SERVICES, INTELLECTUAL PROPERTY OR OTHER
# PROPERTY OR RIGHTS GRANTED OR PROVIDED BY CARNEGIE MELLON UNIVERSITY
# PURSUANT TO THIS LICENSE (HEREINAFTER THE "DELIVERABLES") ARE ON AN
# "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY
# KIND, EITHER EXPRESS OR IMPLIED AS TO ANY MATTER INCLUDING, BUT NOT
# LIMITED TO, WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE,
# MERCHANTABILITY, INFORMATIONAL CONTENT, NONINFRINGEMENT, OR ERROR-FREE
# OPERATION. CARNEGIE MELLON UNIVERSITY SHALL NOT BE LIABLE FOR INDIRECT,
# SPECIAL OR CONSEQUENTIAL DAMAGES, SUCH AS LOSS OF PROFITS OR INABILITY
# TO USE SAID INTELLECTUAL PROPERTY, UNDER THIS LICENSE, REGARDLESS OF
# WHETHER SUCH PARTY WAS AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
# LICENSEE AGREES THAT IT WILL NOT MAKE ANY WARRANTY ON BEHALF OF
# CARNEGIE MELLON UNIVERSITY, EXPRESS OR IMPLIED, TO ANY PERSON
# CONCERNING THE APPLICATION OF OR THE RESULTS TO BE OBTAINED WITH THE
# DELIVERABLES UNDER THIS LICENSE.
# 
# Licensee hereby agrees to defend, indemnify, and hold harmless Carnegie
# Mellon University, its trustees, officers, employees, and agents from
# all claims or demands made against them (and any related losses,
# expenses, or attorney's fees) arising out of, or relating to Licensee's
# and/or its sub licensees' negligent use or willful misuse of or
# negligent conduct or willful misconduct regarding the Software,
# facilities, or other rights or assistance granted by Carnegie Mellon
# University under this License, including, but not limited to, any
# claims of product liability, personal injury, death, damage to
# property, or violation of any laws or regulations.
# 
# Carnegie Mellon University Software Engineering Institute authored
# documents are sponsored by the U.S. Department of Defense under
# Contract F19628-00-C-0003. Carnegie Mellon University retains
# copyrights in all material produced under this contract. The U.S.
# Government retains a non-exclusive, royalty-free license to publish or
# reproduce these documents, or allow others to do so, for U.S.
# Government purposes only pursuant to the copyright license under the
# contract clause at 252.227.7013.
# 
# @GPL_HEADER_END
import logging
import re

class RegexFilter(logging.Filter):
    """
    logging Filter that rejects messages based on a regular expression.
    """
    def __init__(self, re_str, name=''):
        logging.Filter.__init__(self, name)
        self.re = re.compile(re_str)

    def filter(self, record):
        m = self.re.search(record.getMessage())
        if m == None:
            return True
        else:
            return False

class log_factory(object):
    """
    Easily retrieve module-specific Logger, or an extension thereof.

    To use this class, create a module-scope instance at the top of
    the module:

        import rave.logging as rlog
        log = rlog.log_factory("a.b.c")

    Then use it in your code thusly:

        log().debug("debug msg to a.b.c")
        log("d").debug("debug msg to a.b.c.d")
    """
    def __init__(self, basename=None, filters=[]):
        super(log_factory, self).__init__()
        self.basename = basename
        self.filters = filters
        for f in self.filters:
            self.log.addFilter(f)

    def __call__(self, ext=None):
        if ext == None:
            return self
        else:
            return log_factory(self.basename + "." + ext)

    def __getattr__(self, attr):
        log = logging.getLogger(self.basename)
        return getattr(log, attr)


def deprecated(log, feature, ver, msg=""):
    """
    Warn to the log that a feature has been deprecated.
    Parameters:
    log
        logger
            instance to log with
        feature
            string name of feature being deprecated
        ver
            version in which feature was deprecated
        msg
            (optional) additional information about deprecation
    """
    import traceback as tb
    frame = tb.extract_stack()[1]
    log.warn(
          "Deprecation warning: '%s' deprecated in version %s: %s"
        , feature, ver, msg
    )
    log.warn(
          "Deprecated feature apparently used at %s line %d (function '%s') " 
        , frame[0], frame[1], frame[2]
    )
