diff options
author | Łukasz Langa <lukasz@langa.pl> | 2016-11-26 22:04:40 (GMT) |
---|---|---|
committer | Łukasz Langa <lukasz@langa.pl> | 2016-11-26 22:04:40 (GMT) |
commit | de7bf086d2a77f5c963b8a97e1ac9d9bdeff14c7 (patch) | |
tree | e773d848730074aabc6c462e069b83ff34a2635c | |
parent | d80c3fb17bec4dd32129a331b5bd77b5e248d588 (diff) | |
parent | 8fb4e421f41bda398e7d6e1f56b22d912609dc17 (diff) | |
download | cpython-de7bf086d2a77f5c963b8a97e1ac9d9bdeff14c7.zip cpython-de7bf086d2a77f5c963b8a97e1ac9d9bdeff14c7.tar.gz cpython-de7bf086d2a77f5c963b8a97e1ac9d9bdeff14c7.tar.bz2 |
Merge 3.6, fix for #24142
-rw-r--r-- | Lib/configparser.py | 2 | ||||
-rw-r--r-- | Lib/test/test_configparser.py | 24 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 29 insertions, 1 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py index 3a9fb56..af5aca1 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -1102,10 +1102,10 @@ class RawConfigParser(MutableMapping): # raised at the end of the file and will contain a # list of all bogus lines e = self._handle_error(e, fpname, lineno, line) + self._join_multiline_values() # if any parsing errors occurred, raise an exception if e: raise e - self._join_multiline_values() def _join_multiline_values(self): defaults = self.default_section, self._defaults diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index 2b08198..0d06080 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -9,6 +9,7 @@ import warnings from test import support + class SortedDict(collections.UserDict): def items(self): @@ -64,6 +65,7 @@ class CfgParserTestCaseClass: cf.read_string(string) return cf + class BasicTestCase(CfgParserTestCaseClass): def basic_test(self, cf): @@ -828,6 +830,21 @@ boolean {0[0]} NO self.assertEqual(set(cf['section3'].keys()), set()) self.assertEqual(cf.sections(), ['section1', 'section2', 'section3']) + def test_invalid_multiline_value(self): + if self.allow_no_value: + self.skipTest('if no_value is allowed, ParsingError is not raised') + + invalid = textwrap.dedent("""\ + [DEFAULT] + test {0} test + invalid""".format(self.delimiters[0]) + ) + cf = self.newconfig() + with self.assertRaises(configparser.ParsingError): + cf.read_string(invalid) + self.assertEqual(cf.get('DEFAULT', 'test'), 'test') + self.assertEqual(cf['DEFAULT']['test'], 'test') + class StrictTestCase(BasicTestCase, unittest.TestCase): config_class = configparser.RawConfigParser @@ -981,14 +998,17 @@ class ConfigParserTestCaseLegacyInterpolation(ConfigParserTestCase): cf.set("sect", "option2", "foo%%bar") self.assertEqual(cf.get("sect", "option2"), "foo%%bar") + class ConfigParserTestCaseNonStandardDelimiters(ConfigParserTestCase): delimiters = (':=', '$') comment_prefixes = ('//', '"') inline_comment_prefixes = ('//', '"') + class ConfigParserTestCaseNonStandardDefaultSection(ConfigParserTestCase): default_section = 'general' + class MultilineValuesTestCase(BasicTestCase, unittest.TestCase): config_class = configparser.ConfigParser wonderful_spam = ("I'm having spam spam spam spam " @@ -1017,6 +1037,7 @@ class MultilineValuesTestCase(BasicTestCase, unittest.TestCase): self.assertEqual(cf_from_file.get('section8', 'lovely_spam4'), self.wonderful_spam.replace('\t\n', '\n')) + class RawConfigParserTestCase(BasicTestCase, unittest.TestCase): config_class = configparser.RawConfigParser @@ -1059,11 +1080,13 @@ class RawConfigParserTestCase(BasicTestCase, unittest.TestCase): cf.set('non-string', 1, 1) self.assertEqual(cf.get('non-string', 1), 1) + class RawConfigParserTestCaseNonStandardDelimiters(RawConfigParserTestCase): delimiters = (':=', '$') comment_prefixes = ('//', '"') inline_comment_prefixes = ('//', '"') + class RawConfigParserTestSambaConf(CfgParserTestCaseClass, unittest.TestCase): config_class = configparser.RawConfigParser comment_prefixes = ('#', ';', '----') @@ -1258,6 +1281,7 @@ class ConfigParserTestCaseExtendedInterpolation(BasicTestCase, unittest.TestCase class ConfigParserTestCaseNoValue(ConfigParserTestCase): allow_no_value = True + class ConfigParserTestCaseTrickyFile(CfgParserTestCaseClass, unittest.TestCase): config_class = configparser.ConfigParser delimiters = {'='} @@ -664,6 +664,7 @@ Jeremy Hylton Ludwig Hähne Gerhard Häring Fredrik Håård +Florian Höch Catalin Iacob Mihai Ibanescu Ali Ikinci @@ -409,6 +409,9 @@ Library - Issue #27972: Prohibit Tasks to await on themselves. +- Issue #24142: Reading a corrupt config file left configparser in an + invalid state. Original patch by Florian Höch. + Windows ------- |