bpo-33802: Do not interpolate in ConfigParser while reading defaults … · python/cpython@f44203d (original) (raw)

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -1206,8 +1206,16 @@ def add_section(self, section):
1206 1206
1207 1207 def _read_defaults(self, defaults):
1208 1208 """Reads the defaults passed in the initializer, implicitly converting
1209 - values to strings like the rest of the API."""
1210 -self.read_dict({self.default_section: defaults})
1209 + values to strings like the rest of the API.
1210 +
1211 + Does not perform interpolation for backwards compatibility.
1212 + """
1213 +try:
1214 +hold_interpolation = self._interpolation
1215 +self._interpolation = Interpolation()
1216 +self.read_dict({self.default_section: defaults})
1217 +finally:
1218 +self._interpolation = hold_interpolation
1211 1219
1212 1220
1213 1221 class SafeConfigParser(ConfigParser):
Original file line number Diff line number Diff line change
@@ -1451,6 +1451,49 @@ def test_logger_disabling(self):
1451 1451 self.apply_config(self.disable_test, disable_existing_loggers=False)
1452 1452 self.assertFalse(logger.disabled)
1453 1453
1454 +def test_defaults_do_no_interpolation(self):
1455 +"""bpo-33802 defaults should not get interpolated"""
1456 +ini = textwrap.dedent("""
1457 + [formatters]
1458 + keys=default
1459 +
1460 + [formatter_default]
1461 +
1462 + [handlers]
1463 + keys=console
1464 +
1465 + [handler_console]
1466 + class=logging.StreamHandler
1467 + args=tuple()
1468 +
1469 + [loggers]
1470 + keys=root
1471 +
1472 + [logger_root]
1473 + formatter=default
1474 + handlers=console
1475 + """).strip()
1476 +fd, fn = tempfile.mkstemp(prefix='test_logging_', suffix='.ini')
1477 +try:
1478 +os.write(fd, ini.encode('ascii'))
1479 +os.close(fd)
1480 +logging.config.fileConfig(
1481 +fn,
1482 +defaults=dict(
1483 +version=1,
1484 +disable_existing_loggers=False,
1485 +formatters={
1486 +"generic": {
1487 +"format": "%(asctime)s [%(process)d] [%(levelname)s] %(message)s",
1488 +"datefmt": "[%Y-%m-%d %H:%M:%S %z]",
1489 +"class": "logging.Formatter"
1490 + },
1491 + },
1492 + )
1493 + )
1494 +finally:
1495 +os.unlink(fn)
1496 +
1454 1497
1455 1498 class SocketHandlerTest(BaseTest):
1456 1499