pep8 love.
This commit is contained in:
@@ -21,6 +21,7 @@ import types
|
||||
|
||||
IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)
|
||||
|
||||
|
||||
def valid_ident(s):
|
||||
m = IDENTIFIER.match(s)
|
||||
if not m:
|
||||
@@ -33,7 +34,7 @@ def valid_ident(s):
|
||||
try:
|
||||
from logging import _checkLevel
|
||||
except ImportError:
|
||||
def _checkLevel(level):
|
||||
def _checkLevel(level): # noqa
|
||||
if isinstance(level, int):
|
||||
rv = level
|
||||
elif str(level) == level:
|
||||
@@ -54,6 +55,7 @@ except ImportError:
|
||||
# Each wrapper should have a configurator attribute holding the actual
|
||||
# configurator to use for conversion.
|
||||
|
||||
|
||||
class ConvertingDict(dict):
|
||||
"""A converting dictionary wrapper."""
|
||||
|
||||
@@ -68,7 +70,7 @@ class ConvertingDict(dict):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
|
||||
|
||||
def get(self, key, default=None):
|
||||
value = dict.get(self, key, default)
|
||||
result = self.configurator.convert(value)
|
||||
@@ -80,7 +82,7 @@ class ConvertingDict(dict):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
|
||||
|
||||
def pop(self, key, default=None):
|
||||
value = dict.pop(self, key, default)
|
||||
result = self.configurator.convert(value)
|
||||
@@ -91,6 +93,7 @@ class ConvertingDict(dict):
|
||||
result.key = key
|
||||
return result
|
||||
|
||||
|
||||
class ConvertingList(list):
|
||||
"""A converting list wrapper."""
|
||||
def __getitem__(self, key):
|
||||
@@ -114,6 +117,7 @@ class ConvertingList(list):
|
||||
result.parent = self
|
||||
return result
|
||||
|
||||
|
||||
class ConvertingTuple(tuple):
|
||||
"""A converting tuple wrapper."""
|
||||
def __getitem__(self, key):
|
||||
@@ -126,11 +130,12 @@ class ConvertingTuple(tuple):
|
||||
result.key = key
|
||||
return result
|
||||
|
||||
|
||||
class BaseConfigurator(object):
|
||||
"""
|
||||
The configurator base class which defines some useful defaults.
|
||||
"""
|
||||
|
||||
|
||||
CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')
|
||||
|
||||
WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
|
||||
@@ -139,8 +144,8 @@ class BaseConfigurator(object):
|
||||
DIGIT_PATTERN = re.compile(r'^\d+$')
|
||||
|
||||
value_converters = {
|
||||
'ext' : 'ext_convert',
|
||||
'cfg' : 'cfg_convert',
|
||||
'ext': 'ext_convert',
|
||||
'cfg': 'cfg_convert',
|
||||
}
|
||||
|
||||
# We might want to use a different one, e.g. importlib
|
||||
@@ -176,7 +181,7 @@ class BaseConfigurator(object):
|
||||
def ext_convert(self, value):
|
||||
"""Default converter for the ext:// protocol."""
|
||||
return self.resolve(value)
|
||||
|
||||
|
||||
def cfg_convert(self, value):
|
||||
"""Default converter for the cfg:// protocol."""
|
||||
rest = value
|
||||
@@ -199,7 +204,7 @@ class BaseConfigurator(object):
|
||||
d = d[idx]
|
||||
else:
|
||||
try:
|
||||
n = int(idx) # try as number first (most likely)
|
||||
n = int(idx) # try as number first
|
||||
d = d[n]
|
||||
except TypeError:
|
||||
d = d[idx]
|
||||
@@ -227,7 +232,7 @@ class BaseConfigurator(object):
|
||||
isinstance(value, tuple):
|
||||
value = ConvertingTuple(value)
|
||||
value.configurator = self
|
||||
elif isinstance(value, basestring): # str for py3k
|
||||
elif isinstance(value, basestring): # str for py3k
|
||||
m = self.CONVERT_PATTERN.match(value)
|
||||
if m:
|
||||
d = m.groupdict()
|
||||
@@ -238,11 +243,12 @@ class BaseConfigurator(object):
|
||||
converter = getattr(self, converter)
|
||||
value = converter(suffix)
|
||||
return value
|
||||
|
||||
|
||||
def configure_custom(self, config):
|
||||
"""Configure an object with a user-supplied factory."""
|
||||
c = config.pop('()')
|
||||
if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType:
|
||||
if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and \
|
||||
type(c) != types.ClassType:
|
||||
c = self.resolve(c)
|
||||
props = config.pop('.', None)
|
||||
# Check for valid identifiers
|
||||
@@ -259,6 +265,7 @@ class BaseConfigurator(object):
|
||||
value = tuple(value)
|
||||
return value
|
||||
|
||||
|
||||
class DictConfigurator(BaseConfigurator):
|
||||
"""
|
||||
Configure logging using a dictionary-like object to describe the
|
||||
@@ -285,7 +292,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
for name in handlers:
|
||||
if name not in logging._handlers:
|
||||
raise ValueError('No handler found with '
|
||||
'name %r' % name)
|
||||
'name %r' % name)
|
||||
else:
|
||||
try:
|
||||
handler = logging._handlers[name]
|
||||
@@ -312,10 +319,10 @@ class DictConfigurator(BaseConfigurator):
|
||||
'logger: %s' % e)
|
||||
else:
|
||||
disable_existing = config.pop('disable_existing_loggers', True)
|
||||
|
||||
|
||||
logging._handlers.clear()
|
||||
del logging._handlerList[:]
|
||||
|
||||
|
||||
# Do formatters first - they don't refer to anything else
|
||||
formatters = config.get('formatters', EMPTY_DICT)
|
||||
for name in formatters:
|
||||
@@ -347,7 +354,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
raise ValueError('Unable to configure handler '
|
||||
'%r: %s' % (name, e))
|
||||
# Next, do loggers - they refer to handlers and filters
|
||||
|
||||
|
||||
#we don't want to lose the existing loggers,
|
||||
#since other threads may have pointers to them.
|
||||
#existing is set to contain all existing loggers,
|
||||
@@ -374,7 +381,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
prefixed = name + "."
|
||||
pflen = len(prefixed)
|
||||
num_existing = len(existing)
|
||||
i = i + 1 # look at the entry after name
|
||||
i = i + 1 # look at the entry after name
|
||||
while (i < num_existing) and\
|
||||
(existing[i][:pflen] == prefixed):
|
||||
child_loggers.append(existing[i])
|
||||
@@ -385,7 +392,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
except StandardError, e:
|
||||
raise ValueError('Unable to configure logger '
|
||||
'%r: %s' % (name, e))
|
||||
|
||||
|
||||
#Disable any old loggers. There's no point deleting
|
||||
#them as other threads may continue to hold references
|
||||
#and by disabling them, you stop them doing any logging.
|
||||
@@ -399,12 +406,12 @@ class DictConfigurator(BaseConfigurator):
|
||||
logger.propagate = True
|
||||
elif disable_existing:
|
||||
logger.disabled = True
|
||||
|
||||
|
||||
# And finally, do the root logger
|
||||
root = config.get('root', None)
|
||||
if root:
|
||||
try:
|
||||
self.configure_root(root)
|
||||
self.configure_root(root)
|
||||
except StandardError, e:
|
||||
raise ValueError('Unable to configure root '
|
||||
'logger: %s' % e)
|
||||
@@ -414,7 +421,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
def configure_formatter(self, config):
|
||||
"""Configure a formatter from a dictionary."""
|
||||
if '()' in config:
|
||||
factory = config['()'] # for use in exception handler
|
||||
factory = config['()'] # for use in exception handler
|
||||
try:
|
||||
result = self.configure_custom(config)
|
||||
except TypeError, te:
|
||||
@@ -432,7 +439,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
dfmt = config.get('datefmt', None)
|
||||
result = logging.Formatter(fmt, dfmt)
|
||||
return result
|
||||
|
||||
|
||||
def configure_filter(self, config):
|
||||
"""Configure a filter from a dictionary."""
|
||||
if '()' in config:
|
||||
@@ -463,7 +470,8 @@ class DictConfigurator(BaseConfigurator):
|
||||
filters = config.pop('filters', None)
|
||||
if '()' in config:
|
||||
c = config.pop('()')
|
||||
if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType:
|
||||
if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and \
|
||||
type(c) != types.ClassType:
|
||||
c = self.resolve(c)
|
||||
factory = c
|
||||
else:
|
||||
@@ -472,7 +480,9 @@ class DictConfigurator(BaseConfigurator):
|
||||
if issubclass(klass, logging.handlers.MemoryHandler) and\
|
||||
'target' in config:
|
||||
try:
|
||||
config['target'] = self.config['handlers'][config['target']]
|
||||
config['target'] = self.config['handlers'][
|
||||
config['target']
|
||||
]
|
||||
except StandardError, e:
|
||||
raise ValueError('Unable to set target handler '
|
||||
'%r: %s' % (config['target'], e))
|
||||
@@ -528,7 +538,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
filters = config.get('filters', None)
|
||||
if filters:
|
||||
self.add_filters(logger, filters)
|
||||
|
||||
|
||||
def configure_logger(self, name, config, incremental=False):
|
||||
"""Configure a non-root logger from a dictionary."""
|
||||
logger = logging.getLogger(name)
|
||||
@@ -536,7 +546,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
propagate = config.get('propagate', None)
|
||||
if propagate is not None:
|
||||
logger.propagate = propagate
|
||||
|
||||
|
||||
def configure_root(self, config, incremental=False):
|
||||
"""Configure a root logger from a dictionary."""
|
||||
root = logging.getLogger()
|
||||
@@ -544,6 +554,7 @@ class DictConfigurator(BaseConfigurator):
|
||||
|
||||
dictConfigClass = DictConfigurator
|
||||
|
||||
|
||||
def dictConfig(config):
|
||||
"""Configure logging using a dictionary."""
|
||||
dictConfigClass(config).configure()
|
||||
|
||||
@@ -39,7 +39,7 @@ class ErrorDocumentMiddleware(object):
|
||||
'''
|
||||
Intersects HTTP response status code, looks it up in the error map defined
|
||||
in the Pecan app config.py, and routes to the controller assigned to that
|
||||
status.
|
||||
status.
|
||||
'''
|
||||
def __init__(self, app, error_map):
|
||||
self.app = app
|
||||
|
||||
@@ -9,11 +9,11 @@ from util import iscontroller
|
||||
class RestController(object):
|
||||
'''
|
||||
A base class for ``REST`` based controllers. Inherit from this class
|
||||
to implement a REST controller.
|
||||
|
||||
to implement a REST controller.
|
||||
|
||||
``RestController`` implements a set of routing functions which override
|
||||
the default pecan routing with behavior consistent with RESTful routing.
|
||||
This functionality covers navigation to the requested resource
|
||||
This functionality covers navigation to the requested resource
|
||||
controllers, and the appropriate handling of both the common (``GET``,
|
||||
``POST``, ``PUT``, ``DELETE``) as well as custom-defined REST action
|
||||
methods.
|
||||
@@ -22,12 +22,12 @@ class RestController(object):
|
||||
:ref:`rest`.
|
||||
'''
|
||||
_custom_actions = {}
|
||||
|
||||
|
||||
@expose()
|
||||
def _route(self, args):
|
||||
'''
|
||||
Routes a request to the appropriate controller and returns its result.
|
||||
|
||||
|
||||
Performs a bit of validation - refuses to route delete and put actions
|
||||
via a GET request).
|
||||
'''
|
||||
@@ -70,7 +70,7 @@ class RestController(object):
|
||||
|
||||
def _find_sub_controllers(self, remainder):
|
||||
'''
|
||||
Identifies the correct controller to route to by analyzing the
|
||||
Identifies the correct controller to route to by analyzing the
|
||||
request URI.
|
||||
'''
|
||||
# need either a get_one or get to parse args
|
||||
|
||||
@@ -63,7 +63,7 @@ def lookup_controller(obj, url_path):
|
||||
|
||||
def find_object(obj, remainder, notfound_handlers):
|
||||
'''
|
||||
'Walks' the url path in search of an action for which a controller is
|
||||
'Walks' the url path in search of an action for which a controller is
|
||||
implemented and returns that controller object along with what's left
|
||||
of the remainder.
|
||||
'''
|
||||
|
||||
@@ -24,7 +24,7 @@ class JsonRenderer(object):
|
||||
|
||||
# TODO: add error formatter for json (pass it through json lint?)
|
||||
|
||||
_builtin_renderers['json'] = JsonRenderer
|
||||
_builtin_renderers['json'] = JsonRenderer
|
||||
|
||||
#
|
||||
# Genshi rendering engine
|
||||
@@ -218,7 +218,7 @@ class ExtraNamespace(object):
|
||||
|
||||
def update(self, d):
|
||||
'''
|
||||
Updates the extra variable dictionary for the namespace.
|
||||
Updates the extra variable dictionary for the namespace.
|
||||
'''
|
||||
self.namespace.update(d)
|
||||
|
||||
@@ -270,7 +270,7 @@ class RendererFactory(object):
|
||||
def get(self, name, template_path):
|
||||
'''
|
||||
Returns the renderer object.
|
||||
|
||||
|
||||
:param name: name of the requested renderer
|
||||
:param template_path: path to the template
|
||||
'''
|
||||
|
||||
@@ -106,20 +106,25 @@ class BaseTest(unittest.TestCase):
|
||||
self.message_num += 1
|
||||
return "%d" % self.message_num
|
||||
|
||||
|
||||
class ExceptionFormatter(logging.Formatter):
|
||||
"""A special exception formatter."""
|
||||
def formatException(self, ei):
|
||||
return "Got a [%s]" % ei[0].__name__
|
||||
|
||||
|
||||
def formatFunc(format, datefmt=None):
|
||||
return logging.Formatter(format, datefmt)
|
||||
|
||||
|
||||
def handlerFunc():
|
||||
return logging.StreamHandler()
|
||||
|
||||
|
||||
class CustomHandler(logging.StreamHandler):
|
||||
pass
|
||||
|
||||
|
||||
class ConfigDictTest(BaseTest):
|
||||
|
||||
"""Reading logging config from a dictionary."""
|
||||
@@ -130,21 +135,21 @@ class ConfigDictTest(BaseTest):
|
||||
config0 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'handlers' : ['hand1'],
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
}
|
||||
|
||||
@@ -152,392 +157,391 @@ class ConfigDictTest(BaseTest):
|
||||
config1 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# config2 has a subtle configuration error that should be reported
|
||||
config2 = {
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdbout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdbout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#As config1 but with a misspelt level on a handler
|
||||
config2a = {
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NTOSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NTOSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#As config1 but with a misspelt level on a logger
|
||||
config2b = {
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WRANING',
|
||||
'root': {
|
||||
'level': 'WRANING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# config3 has a less subtle configuration error
|
||||
config3 = {
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'misspelled_name',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'misspelled_name',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# config4 specifies a custom formatter class to be loaded
|
||||
config4 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'()' : __name__ + '.ExceptionFormatter',
|
||||
'format' : '%(levelname)s:%(name)s:%(message)s',
|
||||
'form1': {
|
||||
'()': __name__ + '.ExceptionFormatter',
|
||||
'format': '%(levelname)s:%(name)s:%(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'NOTSET',
|
||||
'handlers' : ['hand1'],
|
||||
'root': {
|
||||
'level': 'NOTSET',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# As config4 but using an actual callable rather than a string
|
||||
config4a = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'()' : ExceptionFormatter,
|
||||
'format' : '%(levelname)s:%(name)s:%(message)s',
|
||||
'form1': {
|
||||
'()': ExceptionFormatter,
|
||||
'format': '%(levelname)s:%(name)s:%(message)s',
|
||||
},
|
||||
'form2' : {
|
||||
'()' : __name__ + '.formatFunc',
|
||||
'format' : '%(levelname)s:%(name)s:%(message)s',
|
||||
'form2': {
|
||||
'()': __name__ + '.formatFunc',
|
||||
'format': '%(levelname)s:%(name)s:%(message)s',
|
||||
},
|
||||
'form3' : {
|
||||
'()' : formatFunc,
|
||||
'format' : '%(levelname)s:%(name)s:%(message)s',
|
||||
'form3': {
|
||||
'()': formatFunc,
|
||||
'format': '%(levelname)s:%(name)s:%(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
'hand2' : {
|
||||
'()' : handlerFunc,
|
||||
'hand2': {
|
||||
'()': handlerFunc,
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'NOTSET',
|
||||
'handlers' : ['hand1'],
|
||||
'root': {
|
||||
'level': 'NOTSET',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# config5 specifies a custom handler class to be loaded
|
||||
config5 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : __name__ + '.CustomHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': __name__ + '.CustomHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
# config6 specifies a custom handler class to be loaded
|
||||
# but has bad arguments
|
||||
config6 = {
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : __name__ + '.CustomHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'9' : 'invalid parameter name',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': __name__ + '.CustomHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
'9': 'invalid parameter name',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#config 7 does not define compiler.parser but defines compiler.lexer
|
||||
#so compiler.parser should be disabled after applying it
|
||||
config7 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.lexer' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.lexer': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
config8 = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers' : False,
|
||||
'disable_existing_loggers': False,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler' : {
|
||||
'level' : 'DEBUG',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
'compiler.lexer' : {
|
||||
'compiler.lexer': {
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
config9 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'WARNING',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'WARNING',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'WARNING',
|
||||
'handlers' : ['hand1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'WARNING',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'NOTSET',
|
||||
'root': {
|
||||
'level': 'NOTSET',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
config9a = {
|
||||
'version': 1,
|
||||
'incremental' : True,
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'level' : 'WARNING',
|
||||
'incremental': True,
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'level': 'WARNING',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'INFO',
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'INFO',
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
config9b = {
|
||||
'version': 1,
|
||||
'incremental' : True,
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'level' : 'INFO',
|
||||
'incremental': True,
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'level': 'INFO',
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'INFO',
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'INFO',
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#As config1 but with a filter added
|
||||
config10 = {
|
||||
'version': 1,
|
||||
'formatters': {
|
||||
'form1' : {
|
||||
'format' : '%(levelname)s ++ %(message)s',
|
||||
'form1': {
|
||||
'format': '%(levelname)s ++ %(message)s',
|
||||
},
|
||||
},
|
||||
'filters' : {
|
||||
'filt1' : {
|
||||
'name' : 'compiler.parser',
|
||||
'filters': {
|
||||
'filt1': {
|
||||
'name': 'compiler.parser',
|
||||
},
|
||||
},
|
||||
'handlers' : {
|
||||
'hand1' : {
|
||||
'class' : 'logging.StreamHandler',
|
||||
'formatter' : 'form1',
|
||||
'level' : 'NOTSET',
|
||||
'stream' : 'ext://sys.stdout',
|
||||
'filters' : ['filt1'],
|
||||
'handlers': {
|
||||
'hand1': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'form1',
|
||||
'level': 'NOTSET',
|
||||
'stream': 'ext://sys.stdout',
|
||||
'filters': ['filt1'],
|
||||
},
|
||||
},
|
||||
'loggers' : {
|
||||
'compiler.parser' : {
|
||||
'level' : 'DEBUG',
|
||||
'filters' : ['filt1'],
|
||||
'loggers': {
|
||||
'compiler.parser': {
|
||||
'level': 'DEBUG',
|
||||
'filters': ['filt1'],
|
||||
},
|
||||
},
|
||||
'root' : {
|
||||
'level' : 'WARNING',
|
||||
'handlers' : ['hand1'],
|
||||
'root': {
|
||||
'level': 'WARNING',
|
||||
'handlers': ['hand1'],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
def apply_config(self, conf):
|
||||
dictConfig(conf)
|
||||
@@ -690,15 +694,17 @@ class ConfigDictTest(BaseTest):
|
||||
with captured_stdout() as output:
|
||||
self.apply_config(self.config9)
|
||||
logger = logging.getLogger("compiler.parser")
|
||||
#Nothing will be output since both handler and logger are set to WARNING
|
||||
# Nothing will be output since both handler and logger are
|
||||
# set to WARNING
|
||||
logger.info(self.next_message())
|
||||
self.assert_log_lines([], stream=output)
|
||||
self.apply_config(self.config9a)
|
||||
#Nothing will be output since both handler is still set to WARNING
|
||||
# Nothing will be output since both handler is still set
|
||||
# to WARNING
|
||||
logger.info(self.next_message())
|
||||
self.assert_log_lines([], stream=output)
|
||||
self.apply_config(self.config9b)
|
||||
#Message should now be output
|
||||
# Message should now be output
|
||||
logger.info(self.next_message())
|
||||
if sys.version_info[:2] == (2, 7):
|
||||
self.assert_log_lines([
|
||||
|
||||
Reference in New Issue
Block a user