From 96f31636f4af949dd0975c9381d284915c9d76f6 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Mon, 12 Nov 2007 01:32:03 +0000 Subject: [PATCH] Merged revisions 58930-58938 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r58931 | vinay.sajip | 2007-11-11 15:27:30 +0100 (Sun, 11 Nov 2007) | 1 line Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied. ........ r58932 | georg.brandl | 2007-11-11 16:16:16 +0100 (Sun, 11 Nov 2007) | 2 lines Remove duplication of "this". ........ r58935 | christian.heimes | 2007-11-12 02:15:40 +0100 (Mon, 12 Nov 2007) | 2 lines Added new decorator syntax to property.__doc__ Guido prefers _x over __x. ........ r58936 | christian.heimes | 2007-11-12 02:20:56 +0100 (Mon, 12 Nov 2007) | 2 lines Fix for #1427: Error in standard module calendar the prweek() method is still broken and I can't figure out how it suppose to work. ........ r58938 | andrew.kuchling | 2007-11-12 02:25:21 +0100 (Mon, 12 Nov 2007) | 1 line Re-word sentence ........ --- Doc/reference/introduction.rst | 2 +- Lib/calendar.py | 20 ++++++++++++-------- Lib/logging/config.py | 30 +++++++++++++++++++++++++++--- Objects/descrobject.c | 18 ++++++++++++++---- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/Doc/reference/introduction.rst b/Doc/reference/introduction.rst index ceb2cf37362..6959a770920 100644 --- a/Doc/reference/introduction.rst +++ b/Doc/reference/introduction.rst @@ -58,7 +58,7 @@ Jython Python for .NET This implementation actually uses the CPython implementation, but is a managed - .NET application and makes .NET libraries available. This was created by Brian + .NET application and makes .NET libraries available. It was created by Brian Lloyd. For more information, see the `Python for .NET home page `_. diff --git a/Lib/calendar.py b/Lib/calendar.py index 5487095d01f..e8115180df8 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -6,7 +6,9 @@ Sunday as the last (the European convention). Use setfirstweekday() to set the first day of the week (0=Monday, 6=Sunday).""" from __future__ import with_statement -import sys, datetime, locale +import sys +import datetime +import locale as _locale __all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday", "firstweekday", "isleap", "leapdays", "weekday", "monthrange", @@ -485,11 +487,11 @@ class TimeEncoding: self.locale = locale def __enter__(self): - self.oldlocale = locale.setlocale(locale.LC_TIME, self.locale) - return locale.getlocale(locale.LC_TIME)[1] + self.oldlocale = _locale.setlocale(_locale.LC_TIME, self.locale) + return _locale.getlocale(_locale.LC_TIME)[1] def __exit__(self, *args): - locale.setlocale(locale.LC_TIME, self.oldlocale) + _locale.setlocale(_locale.LC_TIME, self.oldlocale) class LocaleTextCalendar(TextCalendar): @@ -503,7 +505,7 @@ class LocaleTextCalendar(TextCalendar): def __init__(self, firstweekday=0, locale=None): TextCalendar.__init__(self, firstweekday) if locale is None: - locale = locale.getdefaultlocale() + locale = _locale.getdefaultlocale() self.locale = locale def formatweekday(self, day, width): @@ -537,7 +539,7 @@ class LocaleHTMLCalendar(HTMLCalendar): def __init__(self, firstweekday=0, locale=None): HTMLCalendar.__init__(self, firstweekday) if locale is None: - locale = locale.getdefaultlocale() + locale = _locale.getdefaultlocale() self.locale = locale def formatweekday(self, day): @@ -658,9 +660,11 @@ def main(args): parser.error("if --locale is specified --encoding is required") sys.exit(1) + locale = options.locale, options.encoding + if options.type == "html": if options.locale: - cal = LocaleHTMLCalendar(locale=options.locale) + cal = LocaleHTMLCalendar(locale=locale) else: cal = HTMLCalendar() encoding = options.encoding @@ -676,7 +680,7 @@ def main(args): sys.exit(1) else: if options.locale: - cal = LocaleTextCalendar(locale=options.locale) + cal = LocaleTextCalendar(locale=locale) else: cal = TextCalendar() optdict = dict(w=options.width, l=options.lines) diff --git a/Lib/logging/config.py b/Lib/logging/config.py index ed14052acb4..e5b8bb128ab 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -1,4 +1,4 @@ -# Copyright 2001-2005 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2007 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, @@ -22,7 +22,7 @@ by Apache's log4j system. Should work under Python versions >= 1.5.2, except that source line information is not available unless 'sys._getframe()' is. -Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2007 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -203,6 +203,14 @@ def _install_loggers(cp, handlers): #which were in the previous configuration but #which are not in the new configuration. existing = list(root.manager.loggerDict.keys()) + #The list needs to be sorted so that we can + #avoid disabling child loggers of explicitly + #named loggers. With a sorted list it is easier + #to find the child loggers. + existing.sort() + #We'll keep the list of existing loggers + #which are children of named loggers here... + child_loggers = [] #now set up the new ones... for log in llist: sectname = "logger_%s" % log @@ -214,6 +222,14 @@ def _install_loggers(cp, handlers): propagate = 1 logger = logging.getLogger(qn) if qn in existing: + i = existing.index(qn) + prefixed = qn + "." + pflen = len(prefixed) + num_existing = len(existing) + i = i + 1 # look at the entry after qn + while (i < num_existing) and (existing[i][:pflen] == prefixed): + child_loggers.append(existing[i]) + i = i + 1 existing.remove(qn) if "level" in opts: level = cp.get(sectname, "level") @@ -231,8 +247,16 @@ def _install_loggers(cp, handlers): #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. + #However, don't disable children of named loggers, as that's + #probably not what was intended by the user. for log in existing: - root.manager.loggerDict[log].disabled = 1 + logger = root.manager.loggerDict[log] + if log in child_loggers: + logger.level = logging.NOTSET + logger.handlers = [] + logger.propagate = 1 + else: + logger.disabled = 1 def listen(port=DEFAULT_LOGGING_CONFIG_PORT): diff --git a/Objects/descrobject.c b/Objects/descrobject.c index a0fc2170a4d..8e4dd2e7ec4 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1259,10 +1259,20 @@ PyDoc_STRVAR(property_doc, "fset is a function for setting, and fdel a function for del'ing, an\n" "attribute. Typical use is to define a managed attribute x:\n" "class C(object):\n" -" def getx(self): return self.__x\n" -" def setx(self, value): self.__x = value\n" -" def delx(self): del self.__x\n" -" x = property(getx, setx, delx, \"I'm the 'x' property.\")"); +" def getx(self): return self._x\n" +" def setx(self, value): self._x = value\n" +" def delx(self): del self._x\n" +" x = property(getx, setx, delx, \"I'm the 'x' property.\")\n" +"\n" +"Decorators make defining new properties or modifying existing ones easy:\n" +"class C(object):\n" +" @property\n" +" def x(self): return self._x\n" +" @x.setter\n" +" def x(self, value): self._x = value\n" +" @x.deleter\n" +" def x(self): del self._x\n" +); static int property_traverse(PyObject *self, visitproc visit, void *arg)