Merged revisions 78232 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r78232 | fred.drake | 2010-02-19 00:24:30 -0500 (Fri, 19 Feb 2010) | 3 lines

  - apply patch from issue 7005
  - add corresponding documentation
........
diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py
index 6271d6f..6acab6b 100644
--- a/Lib/test/test_cfgparser.py
+++ b/Lib/test/test_cfgparser.py
@@ -6,6 +6,7 @@
 from test import support
 
 class SortedDict(collections.UserDict):
+
     def items(self):
         return sorted(self.data.items())
 
@@ -20,12 +21,16 @@
     __iter__ = iterkeys
     def itervalues(self): return iter(self.values())
 
+
 class TestCaseBase(unittest.TestCase):
+    allow_no_value = False
+
     def newconfig(self, defaults=None):
         if defaults is None:
-            self.cf = self.config_class()
+            self.cf = self.config_class(allow_no_value=self.allow_no_value)
         else:
-            self.cf = self.config_class(defaults)
+            self.cf = self.config_class(defaults,
+                                        allow_no_value=self.allow_no_value)
         return self.cf
 
     def fromstring(self, string, defaults=None):
@@ -35,7 +40,7 @@
         return cf
 
     def test_basic(self):
-        cf = self.fromstring(
+        config_string = (
             "[Foo Bar]\n"
             "foo=bar\n"
             "[Spacey Bar]\n"
@@ -55,17 +60,28 @@
             "key with spaces : value\n"
             "another with spaces = splat!\n"
             )
+        if self.allow_no_value:
+            config_string += (
+                "[NoValue]\n"
+                "option-without-value\n"
+                )
+
+        cf = self.fromstring(config_string)
         L = cf.sections()
         L.sort()
+        E = [r'Commented Bar',
+             r'Foo Bar',
+             r'Internationalized Stuff',
+             r'Long Line',
+             r'Section\with$weird%characters[' '\t',
+             r'Spaces',
+             r'Spacey Bar',
+             ]
+        if self.allow_no_value:
+            E.append(r'NoValue')
+        E.sort()
         eq = self.assertEqual
-        eq(L, [r'Commented Bar',
-               r'Foo Bar',
-               r'Internationalized Stuff',
-               r'Long Line',
-               r'Section\with$weird%characters[' '\t',
-               r'Spaces',
-               r'Spacey Bar',
-               ])
+        eq(L, E)
 
         # The use of spaces in the section names serves as a
         # regression test for SourceForge bug #583248:
@@ -75,6 +91,8 @@
         eq(cf.get('Commented Bar', 'foo'), 'bar')
         eq(cf.get('Spaces', 'key with spaces'), 'value')
         eq(cf.get('Spaces', 'another with spaces'), 'splat!')
+        if self.allow_no_value:
+            eq(cf.get('NoValue', 'option-without-value'), None)
 
         self.assertNotIn('__name__', cf.options("Foo Bar"),
                          '__name__ "option" should not be exposed by the API!')
@@ -147,8 +165,6 @@
         self.parse_error(configparser.ParsingError,
                          "[Foo]\n  extra-spaces= splat\n")
         self.parse_error(configparser.ParsingError,
-                         "[Foo]\noption-without-value\n")
-        self.parse_error(configparser.ParsingError,
                          "[Foo]\n:value-without-option-name\n")
         self.parse_error(configparser.ParsingError,
                          "[Foo]\n=value-without-option-name\n")
@@ -214,18 +230,24 @@
                           cf.add_section, "Foo")
 
     def test_write(self):
-        cf = self.fromstring(
+        config_string = (
             "[Long Line]\n"
             "foo: this line is much, much longer than my editor\n"
             "   likes it.\n"
             "[DEFAULT]\n"
             "foo: another very\n"
-            " long line"
+            " long line\n"
             )
+        if self.allow_no_value:
+            config_string += (
+            "[Valueless]\n"
+            "option-without-value\n"
+            )
+
+        cf = self.fromstring(config_string)
         output = io.StringIO()
         cf.write(output)
-        self.assertEqual(
-            output.getvalue(),
+        expect_string = (
             "[DEFAULT]\n"
             "foo = another very\n"
             "\tlong line\n"
@@ -235,6 +257,13 @@
             "\tlikes it.\n"
             "\n"
             )
+        if self.allow_no_value:
+            expect_string += (
+                "[Valueless]\n"
+                "option-without-value\n"
+                "\n"
+                )
+        self.assertEqual(output.getvalue(), expect_string)
 
     def test_set_string_types(self):
         cf = self.fromstring("[sect]\n"
@@ -328,7 +357,7 @@
         self.get_error(configparser.InterpolationDepthError, "Foo", "bar11")
 
     def test_interpolation_missing_value(self):
-        cf = self.get_interpolation_config()
+        self.get_interpolation_config()
         e = self.get_error(configparser.InterpolationError,
                            "Interpolation Error", "name")
         self.assertEqual(e.reference, "reference")
@@ -448,6 +477,11 @@
         cf = self.newconfig()
         self.assertRaises(ValueError, cf.add_section, "DEFAULT")
 
+
+class SafeConfigParserTestCaseNoValue(SafeConfigParserTestCase):
+    allow_no_value = True
+
+
 class SortedTestCase(RawConfigParserTestCase):
     def newconfig(self, defaults=None):
         self.cf = self.config_class(defaults=defaults, dict_type=SortedDict)
@@ -472,13 +506,16 @@
                           "o3 = 2\n"
                           "o4 = 1\n\n")
 
+
 def test_main():
     support.run_unittest(
         ConfigParserTestCase,
         RawConfigParserTestCase,
         SafeConfigParserTestCase,
-        SortedTestCase
-    )
+        SortedTestCase,
+        SafeConfigParserTestCaseNoValue,
+        )
+
 
 if __name__ == "__main__":
     test_main()