diff options
| author | Brett Cannon <brett@python.org> | 2014-03-21 15:02:10 (GMT) | 
|---|---|---|
| committer | Brett Cannon <brett@python.org> | 2014-03-21 15:02:10 (GMT) | 
| commit | 46f484ee4e56c9e4589a43a20b32c0d65a23e537 (patch) | |
| tree | 82074db069bde6bf9f2143243bfb43ea6c0204dc /Lib/logging/config.py | |
| parent | a00c2407caed1fe61bdd92788f7a8eb27fcff969 (diff) | |
| parent | ed6783f315c0efe49f981b820332fc5067eace36 (diff) | |
| download | cpython-46f484ee4e56c9e4589a43a20b32c0d65a23e537.zip cpython-46f484ee4e56c9e4589a43a20b32c0d65a23e537.tar.gz cpython-46f484ee4e56c9e4589a43a20b32c0d65a23e537.tar.bz2  | |
merge
Diffstat (limited to 'Lib/logging/config.py')
| -rw-r--r-- | Lib/logging/config.py | 107 | 
1 files changed, 45 insertions, 62 deletions
diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 10187e8..895fb26 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -1,4 +1,4 @@ -# Copyright 2001-2013 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2014 by Vinay Sajip. All Rights Reserved.  #  # Permission to use, copy, modify, and distribute this software and its  # documentation for any purpose and without fee is hereby granted, @@ -19,13 +19,19 @@ Configuration functions for the logging package for Python. The core package  is based on PEP 282 and comments thereto in comp.lang.python, and influenced  by Apache's log4j system. -Copyright (C) 2001-2013 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.  To use, simply 'import logging' and log away!  """ -import sys, logging, logging.handlers, struct, traceback, re +import errno  import io +import logging +import logging.handlers +import re +import struct +import sys +import traceback  try:      import _thread as thread @@ -38,10 +44,7 @@ from socketserver import ThreadingTCPServer, StreamRequestHandler  DEFAULT_LOGGING_CONFIG_PORT = 9030 -if sys.platform == "win32": -    RESET_ERROR = 10054   #WSAECONNRESET -else: -    RESET_ERROR = 104     #ECONNRESET +RESET_ERROR = errno.ECONNRESET  #  #   The following code implements a socket listener for on-the-fly @@ -274,6 +277,30 @@ def valid_ident(s):      return True +class ConvertingMixin(object): +    """For ConvertingXXX's, this mixin class provides common functions""" + +    def convert_with_key(self, key, value, replace=True): +        result = self.configurator.convert(value) +        #If the converted value is different, save for next time +        if value is not result: +            if replace: +                self[key] = result +            if type(result) in (ConvertingDict, ConvertingList, +                               ConvertingTuple): +                result.parent = self +                result.key = key +        return result + +    def convert(self, value): +        result = self.configurator.convert(value) +        if value is not result: +            if type(result) in (ConvertingDict, ConvertingList, +                               ConvertingTuple): +                result.parent = self +        return result + +  # The ConvertingXXX classes are wrappers around standard Python containers,  # and they serve to convert any suitable values in the container. The  # conversion converts base dicts, lists and tuples to their wrapped @@ -283,77 +310,37 @@ def valid_ident(s):  # Each wrapper should have a configurator attribute holding the actual  # configurator to use for conversion. -class ConvertingDict(dict): +class ConvertingDict(dict, ConvertingMixin):      """A converting dictionary wrapper."""      def __getitem__(self, key):          value = dict.__getitem__(self, key) -        result = self.configurator.convert(value) -        #If the converted value is different, save for next time -        if value is not result: -            self[key] = result -            if type(result) in (ConvertingDict, ConvertingList, -                                ConvertingTuple): -                result.parent = self -                result.key = key -        return result +        return self.convert_with_key(key, value)      def get(self, key, default=None):          value = dict.get(self, key, default) -        result = self.configurator.convert(value) -        #If the converted value is different, save for next time -        if value is not result: -            self[key] = result -            if type(result) in (ConvertingDict, ConvertingList, -                                ConvertingTuple): -                result.parent = self -                result.key = key -        return result +        return self.convert_with_key(key, value)      def pop(self, key, default=None):          value = dict.pop(self, key, default) -        result = self.configurator.convert(value) -        if value is not result: -            if type(result) in (ConvertingDict, ConvertingList, -                                ConvertingTuple): -                result.parent = self -                result.key = key -        return result +        return self.convert_with_key(key, value, replace=False) -class ConvertingList(list): +class ConvertingList(list, ConvertingMixin):      """A converting list wrapper."""      def __getitem__(self, key):          value = list.__getitem__(self, key) -        result = self.configurator.convert(value) -        #If the converted value is different, save for next time -        if value is not result: -            self[key] = result -            if type(result) in (ConvertingDict, ConvertingList, -                                ConvertingTuple): -                result.parent = self -                result.key = key -        return result +        return self.convert_with_key(key, value)      def pop(self, idx=-1):          value = list.pop(self, idx) -        result = self.configurator.convert(value) -        if value is not result: -            if type(result) in (ConvertingDict, ConvertingList, -                                ConvertingTuple): -                result.parent = self -        return result +        return self.convert(value) -class ConvertingTuple(tuple): +class ConvertingTuple(tuple, ConvertingMixin):      """A converting tuple wrapper."""      def __getitem__(self, key):          value = tuple.__getitem__(self, key) -        result = self.configurator.convert(value) -        if value is not result: -            if type(result) in (ConvertingDict, ConvertingList, -                                ConvertingTuple): -                result.parent = self -                result.key = key -        return result +        # Can't replace a tuple entry. +        return self.convert_with_key(key, value, replace=False)  class BaseConfigurator(object):      """ @@ -867,12 +854,8 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None):                      if self.server.ready:                          self.server.ready.set()              except OSError as e: -                if not isinstance(e.args, tuple): +                if e.errno != RESET_ERROR:                      raise -                else: -                    errcode = e.args[0] -                    if errcode != RESET_ERROR: -                        raise      class ConfigSocketReceiver(ThreadingTCPServer):          """  | 
