]> granicus.if.org Git - python/commitdiff
Fixes `parser.clean()` reported in issue #16820.
authorŁukasz Langa <lukasz@langa.pl>
Mon, 31 Dec 2012 02:38:39 +0000 (03:38 +0100)
committerŁukasz Langa <lukasz@langa.pl>
Mon, 31 Dec 2012 02:38:39 +0000 (03:38 +0100)
Doc/library/configparser.rst
Lib/configparser.py
Lib/test/test_cfgparser.py

index 958375b5a203399ac3a76b84d1d817a2d10fc183..0b8212c16437096f29336a62670e6907034da4c5 100644 (file)
@@ -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
index 06d594a4317c5a1783c3875bf8e85c201853e462..243efec4bd3890c566ba87e691dcb6054f18bf6c 100644 (file)
@@ -851,6 +851,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()
 
index a6e905049fb8e3ac5a71f0f309de2e3874367199..7a9e8a8c1f3c937cd5883abdd090fa17ae8b9270 100644 (file)
@@ -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