diff options
author | Łukasz Langa <lukasz@langa.pl> | 2013-06-23 17:12:12 (GMT) |
---|---|---|
committer | Łukasz Langa <lukasz@langa.pl> | 2013-06-23 17:12:12 (GMT) |
commit | 82276964c8c0b99d86adb8eff0230f1d24982be3 (patch) | |
tree | e51174c53d19e20a2a4ef18e2ca3444fb51401c9 /Lib | |
parent | fcce2024ea97c76e25adf9ff45f72a9f0d431ac3 (diff) | |
parent | f9b4eb4d04609c6cb0f56edfd1ca3d15b349eadf (diff) | |
download | cpython-82276964c8c0b99d86adb8eff0230f1d24982be3.zip cpython-82276964c8c0b99d86adb8eff0230f1d24982be3.tar.gz cpython-82276964c8c0b99d86adb8eff0230f1d24982be3.tar.bz2 |
Merged fix for issue #18260 from 3.3
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/configparser.py | 4 | ||||
-rw-r--r-- | Lib/test/test_configparser.py | 74 |
2 files changed, 65 insertions, 13 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py index 708553d..794f857 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -191,7 +191,7 @@ class DuplicateSectionError(Error): def __init__(self, section, source=None, lineno=None): msg = [repr(section), " already exists"] if source is not None: - message = ["While reading from ", source] + message = ["While reading from ", repr(source)] if lineno is not None: message.append(" [line {0:2d}]".format(lineno)) message.append(": section ") @@ -217,7 +217,7 @@ class DuplicateOptionError(Error): msg = [repr(option), " in section ", repr(section), " already exists"] if source is not None: - message = ["While reading from ", source] + message = ["While reading from ", repr(source)] if lineno is not None: message.append(" [line {0:2d}]".format(lineno)) message.append(": option ") diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index fc56550..29e7ed9 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -626,15 +626,15 @@ boolean {0[0]} NO oops{equals}this won't """.format(equals=self.delimiters[0])), source='<foo-bar>') e = cm.exception - self.assertEqual(str(e), "While reading from <foo-bar> [line 5]: " - "section 'Foo' already exists") + self.assertEqual(str(e), "While reading from '<foo-bar>' " + "[line 5]: section 'Foo' already exists") self.assertEqual(e.args, ("Foo", '<foo-bar>', 5)) with self.assertRaises(configparser.DuplicateOptionError) as cm: cf.read_dict({'Bar': {'opt': 'val', 'OPT': 'is really `opt`'}}) e = cm.exception - self.assertEqual(str(e), "While reading from <dict>: option 'opt' " - "in section 'Bar' already exists") + self.assertEqual(str(e), "While reading from '<dict>': option " + "'opt' in section 'Bar' already exists") self.assertEqual(e.args, ("Bar", "opt", "<dict>", None)) def test_write(self): @@ -1419,13 +1419,18 @@ def readline_generator(f): class ReadFileTestCase(unittest.TestCase): def test_file(self): - file_path = support.findfile("cfgparser.1") - parser = configparser.ConfigParser() - with open(file_path) as f: - parser.read_file(f) - self.assertIn("Foo Bar", parser) - self.assertIn("foo", parser["Foo Bar"]) - self.assertEqual(parser["Foo Bar"]["foo"], "newbar") + file_paths = [support.findfile("cfgparser.1")] + try: + file_paths.append(file_paths[0].encode('utf8')) + except UnicodeEncodeError: + pass # unfortunately we can't test bytes on this path + for file_path in file_paths: + parser = configparser.ConfigParser() + with open(file_path) as f: + parser.read_file(f) + self.assertIn("Foo Bar", parser) + self.assertIn("foo", parser["Foo Bar"]) + self.assertEqual(parser["Foo Bar"]["foo"], "newbar") def test_iterable(self): lines = textwrap.dedent(""" @@ -1447,6 +1452,53 @@ class ReadFileTestCase(unittest.TestCase): self.assertIn("foo", parser["Foo Bar"]) self.assertEqual(parser["Foo Bar"]["foo"], "newbar") + def test_source_as_bytes(self): + """Issue #18260.""" + lines = textwrap.dedent(""" + [badbad] + [badbad]""").strip().split('\n') + parser = configparser.ConfigParser() + with self.assertRaises(configparser.DuplicateSectionError) as dse: + parser.read_file(lines, source=b"badbad") + self.assertEqual( + str(dse.exception), + "While reading from b'badbad' [line 2]: section 'badbad' " + "already exists" + ) + lines = textwrap.dedent(""" + [badbad] + bad = bad + bad = bad""").strip().split('\n') + parser = configparser.ConfigParser() + with self.assertRaises(configparser.DuplicateOptionError) as dse: + parser.read_file(lines, source=b"badbad") + self.assertEqual( + str(dse.exception), + "While reading from b'badbad' [line 3]: option 'bad' in section " + "'badbad' already exists" + ) + lines = textwrap.dedent(""" + [badbad] + = bad""").strip().split('\n') + parser = configparser.ConfigParser() + with self.assertRaises(configparser.ParsingError) as dse: + parser.read_file(lines, source=b"badbad") + self.assertEqual( + str(dse.exception), + "Source contains parsing errors: b'badbad'\n\t[line 2]: '= bad'" + ) + lines = textwrap.dedent(""" + [badbad + bad = bad""").strip().split('\n') + parser = configparser.ConfigParser() + with self.assertRaises(configparser.MissingSectionHeaderError) as dse: + parser.read_file(lines, source=b"badbad") + self.assertEqual( + str(dse.exception), + "File contains no section headers.\nfile: b'badbad', line: 1\n" + "'[badbad'" + ) + class CoverageOneHundredTestCase(unittest.TestCase): """Covers edge cases in the codebase.""" |