summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
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)
commit82276964c8c0b99d86adb8eff0230f1d24982be3 (patch)
treee51174c53d19e20a2a4ef18e2ca3444fb51401c9 /Lib
parentfcce2024ea97c76e25adf9ff45f72a9f0d431ac3 (diff)
parentf9b4eb4d04609c6cb0f56edfd1ca3d15b349eadf (diff)
downloadcpython-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.py4
-rw-r--r--Lib/test/test_configparser.py74
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."""