From 68a1abdadec2377fd3e8d2211cb3cc119de77a28 Mon Sep 17 00:00:00 2001 From: David Goodger Date: Sun, 3 Oct 2004 15:40:25 +0000 Subject: [PATCH] SF bug #1017864: ConfigParser now correctly handles default keys, processing them with ``ConfigParser.optionxform`` when supplied, consistent with the handling of config file entries and runtime-set options. --- Lib/ConfigParser.py | 16 +++++++++------- Lib/test/test_cfgparser.py | 10 ++++++++++ Misc/NEWS | 5 +++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Lib/ConfigParser.py b/Lib/ConfigParser.py index 5f80269407c..acbf3ea144a 100644 --- a/Lib/ConfigParser.py +++ b/Lib/ConfigParser.py @@ -202,10 +202,10 @@ class MissingSectionHeaderError(ParsingError): class RawConfigParser: def __init__(self, defaults=None): self._sections = {} - if defaults is None: - self._defaults = {} - else: - self._defaults = defaults + self._defaults = {} + if defaults: + for key, value in defaults.items(): + self._defaults[self.optionxform(key)] = value def defaults(self): return self._defaults @@ -511,8 +511,9 @@ class ConfigParser(RawConfigParser): if section != DEFAULTSECT: raise NoSectionError(section) # Update with the entry specific variables - if vars is not None: - d.update(vars) + if vars: + for key, value in vars.items(): + d[self.optionxform(key)] = value option = self.optionxform(option) try: value = d[option] @@ -544,7 +545,8 @@ class ConfigParser(RawConfigParser): raise NoSectionError(section) # Update with the entry specific variables if vars: - d.update(vars) + for key, value in vars.items(): + d[self.optionxform(key)] = value options = d.keys() if "__name__" in options: options.remove("__name__") diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py index c799c7df0a7..6b3e68a6d16 100644 --- a/Lib/test/test_cfgparser.py +++ b/Lib/test/test_cfgparser.py @@ -115,6 +115,16 @@ class TestCaseBase(unittest.TestCase): self.failUnless(cf.has_option("section", "Key")) + def test_default_case_sensitivity(self): + cf = self.newconfig({"foo": "Bar"}) + self.assertEqual( + cf.get("DEFAULT", "Foo"), "Bar", + "could not locate option, expecting case-insensitive option names") + cf = self.newconfig({"Foo": "Bar"}) + self.assertEqual( + cf.get("DEFAULT", "Foo"), "Bar", + "could not locate option, expecting case-insensitive defaults") + def test_parse_errors(self): self.newconfig() self.parse_error(ConfigParser.ParsingError, diff --git a/Misc/NEWS b/Misc/NEWS index cf7a321b557..634f661fbc4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -94,6 +94,11 @@ Library - httplib now handles ipv6 address/port pairs. +- SF bug #1017864: ConfigParser now correctly handles default keys, + processing them with ``ConfigParser.optionxform`` when supplied, + consistent with the handling of config file entries and runtime-set + options. + Build -----