]> granicus.if.org Git - python/commitdiff
bpo-33802: Do not interpolate in ConfigParser while reading defaults (GH-7524)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 8 Jun 2018 14:01:56 +0000 (07:01 -0700)
committerGitHub <noreply@github.com>
Fri, 8 Jun 2018 14:01:56 +0000 (07:01 -0700)
This solves a regression in logging config due to changes in BPO-23835.
(cherry picked from commit 214f18e49feb6a9d6c05aa09a4bb304905e81334)

Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
Lib/configparser.py
Lib/test/test_logging.py

index 33dc9b9046f102a414b41a26389e5306b2107330..445fa99ccb4b3ba79af06dd00f940a27f9f04705 100644 (file)
@@ -1206,8 +1206,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):
index eee2ed0c19ec11dd3fb93aaf854735132c2fb3d4..0fa3892e57a3160c6d41d750e152577595117376 100644 (file)
@@ -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):