summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2012-12-31 02:43:37 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2012-12-31 02:43:37 (GMT)
commit1dce0003a662c8d1adf664b598b7941ad83bf23b (patch)
treebf014f95dacb7e6ff71baa6439959feb6afed1d1 /Lib
parent641bb6607025689871839cbd275f5e4b5e16f5a4 (diff)
parent0dc5ab41f07a26deaebe46f593e572e221772aa2 (diff)
downloadcpython-1dce0003a662c8d1adf664b598b7941ad83bf23b.zip
cpython-1dce0003a662c8d1adf664b598b7941ad83bf23b.tar.gz
cpython-1dce0003a662c8d1adf664b598b7941ad83bf23b.tar.bz2
Merged `parser.clean()` fix (issue #16820) from 3.2 through 3.3.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/configparser.py13
-rw-r--r--Lib/test/test_configparser.py27
2 files changed, 40 insertions, 0 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py
index f18b287..c0272cd 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 8d82182..37dee74 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