From 214f18e49feb6a9d6c05aa09a4bb304905e81334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Fri, 8 Jun 2018 04:02:48 -0700 Subject: [PATCH] bpo-33802: Do not interpolate in ConfigParser while reading defaults (GH-7524) This solves a regression in logging config due to changes in BPO-23835. --- Lib/configparser.py | 12 +++++++++-- Lib/test/test_logging.py | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Lib/configparser.py b/Lib/configparser.py index c88605feff7..ea788aec510 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -1208,8 +1208,16 @@ class ConfigParser(RawConfigParser): def _read_defaults(self, defaults): """Reads the defaults passed in the initializer, implicitly converting - values to strings like the rest of the API.""" - self.read_dict({self.default_section: defaults}) + values to strings like the rest of the API. + + Does not perform interpolation for backwards compatibility. + """ + try: + hold_interpolation = self._interpolation + self._interpolation = Interpolation() + self.read_dict({self.default_section: defaults}) + finally: + self._interpolation = hold_interpolation class SafeConfigParser(ConfigParser): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 5098866237c..ba70b117d1e 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1451,6 +1451,49 @@ class ConfigFileTest(BaseTest): self.apply_config(self.disable_test, disable_existing_loggers=False) self.assertFalse(logger.disabled) + def test_defaults_do_no_interpolation(self): + """bpo-33802 defaults should not get interpolated""" + ini = textwrap.dedent(""" + [formatters] + keys=default + + [formatter_default] + + [handlers] + keys=console + + [handler_console] + class=logging.StreamHandler + args=tuple() + + [loggers] + keys=root + + [logger_root] + formatter=default + handlers=console + """).strip() + fd, fn = tempfile.mkstemp(prefix='test_logging_', suffix='.ini') + try: + os.write(fd, ini.encode('ascii')) + os.close(fd) + logging.config.fileConfig( + fn, + defaults=dict( + version=1, + disable_existing_loggers=False, + formatters={ + "generic": { + "format": "%(asctime)s [%(process)d] [%(levelname)s] %(message)s", + "datefmt": "[%Y-%m-%d %H:%M:%S %z]", + "class": "logging.Formatter" + }, + }, + ) + ) + finally: + os.unlink(fn) + class SocketHandlerTest(BaseTest):