diff options
author | Łukasz Langa <lukasz@langa.pl> | 2012-12-31 03:43:37 +0100 |
---|---|---|
committer | Łukasz Langa <lukasz@langa.pl> | 2012-12-31 03:43:37 +0100 |
commit | 1dce0003a662c8d1adf664b598b7941ad83bf23b (patch) | |
tree | bf014f95dacb7e6ff71baa6439959feb6afed1d1 | |
parent | 641bb6607025689871839cbd275f5e4b5e16f5a4 (diff) | |
parent | 0dc5ab41f07a26deaebe46f593e572e221772aa2 (diff) | |
download | cpython-git-1dce0003a662c8d1adf664b598b7941ad83bf23b.tar.gz |
Merged `parser.clean()` fix (issue #16820) from 3.2 through 3.3.
-rw-r--r-- | Doc/library/configparser.rst | 8 | ||||
-rw-r--r-- | Lib/configparser.py | 13 | ||||
-rw-r--r-- | Lib/test/test_configparser.py | 27 | ||||
-rw-r--r-- | Misc/ACKS | 1 |
4 files changed, 48 insertions, 1 deletions
diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index 958375b5a2..0b8212c164 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -389,7 +389,13 @@ However, there are a few differences that should be taken into account: the default value to be visible again. Trying to delete a default value causes a ``KeyError``. -* Trying to delete the ``DEFAULTSECT`` raises ``ValueError``. +* ``DEFAULTSECT`` cannot be removed from the parser: + + * trying to delete it raises ``ValueError``, + + * ``parser.clear()`` leaves it intact, + + * ``parser.popitem()`` never returns it. * ``parser.get(section, option, **kwargs)`` - the second argument is **not** a fallback value. Note however that the section-level ``get()`` methods are diff --git a/Lib/configparser.py b/Lib/configparser.py index f18b287893..c0272cd789 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -852,6 +852,19 @@ class RawConfigParser(MutableMapping): value_getter = lambda option: d[option] return [(option, value_getter(option)) for option in d.keys()] + def popitem(self): + """Remove a section from the parser and return it as + a (section_name, section_proxy) tuple. If no section is present, raise + KeyError. + + The section DEFAULT is never returned because it cannot be removed. + """ + for key in self.sections(): + value = self[key] + del self[key] + return key, value + raise KeyError + def optionxform(self, optionstr): return optionstr.lower() diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index 8d82182d28..37dee744d1 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -770,6 +770,33 @@ boolean {0[0]} NO with self.assertRaises(configparser.NoSectionError): cf.items("no such section") + def test_popitem(self): + cf = self.fromstring(""" + [section1] + name1 {0[0]} value1 + [section2] + name2 {0[0]} value2 + [section3] + name3 {0[0]} value3 + """.format(self.delimiters), defaults={"default": "<default>"}) + self.assertEqual(cf.popitem()[0], 'section1') + self.assertEqual(cf.popitem()[0], 'section2') + self.assertEqual(cf.popitem()[0], 'section3') + with self.assertRaises(KeyError): + cf.popitem() + + def test_clear(self): + cf = self.newconfig({"foo": "Bar"}) + self.assertEqual( + cf.get(self.default_section, "Foo"), "Bar", + "could not locate option, expecting case-insensitive option names") + cf['zing'] = {'option1': 'value1', 'option2': 'value2'} + self.assertEqual(cf.sections(), ['zing']) + self.assertEqual(set(cf['zing'].keys()), {'option1', 'option2', 'foo'}) + cf.clear() + self.assertEqual(set(cf.sections()), set()) + self.assertEqual(set(cf[self.default_section].keys()), {'foo'}) + class StrictTestCase(BasicTestCase): config_class = configparser.RawConfigParser @@ -1057,6 +1057,7 @@ Michael Scharf Andreas Schawo Neil Schemenauer David Scherer +Wolfgang Scherer Hynek Schlawack Bob Schmertz Gregor Schmid |