Fixed issue #18260: configparser TypeError on source name specified as bytes
This commit is contained in:
parent
36a7e4f74a
commit
f9b4eb4d04
|
@ -191,7 +191,7 @@ class DuplicateSectionError(Error):
|
||||||
def __init__(self, section, source=None, lineno=None):
|
def __init__(self, section, source=None, lineno=None):
|
||||||
msg = [repr(section), " already exists"]
|
msg = [repr(section), " already exists"]
|
||||||
if source is not None:
|
if source is not None:
|
||||||
message = ["While reading from ", source]
|
message = ["While reading from ", repr(source)]
|
||||||
if lineno is not None:
|
if lineno is not None:
|
||||||
message.append(" [line {0:2d}]".format(lineno))
|
message.append(" [line {0:2d}]".format(lineno))
|
||||||
message.append(": section ")
|
message.append(": section ")
|
||||||
|
@ -217,7 +217,7 @@ class DuplicateOptionError(Error):
|
||||||
msg = [repr(option), " in section ", repr(section),
|
msg = [repr(option), " in section ", repr(section),
|
||||||
" already exists"]
|
" already exists"]
|
||||||
if source is not None:
|
if source is not None:
|
||||||
message = ["While reading from ", source]
|
message = ["While reading from ", repr(source)]
|
||||||
if lineno is not None:
|
if lineno is not None:
|
||||||
message.append(" [line {0:2d}]".format(lineno))
|
message.append(" [line {0:2d}]".format(lineno))
|
||||||
message.append(": option ")
|
message.append(": option ")
|
||||||
|
|
|
@ -626,15 +626,15 @@ boolean {0[0]} NO
|
||||||
oops{equals}this won't
|
oops{equals}this won't
|
||||||
""".format(equals=self.delimiters[0])), source='<foo-bar>')
|
""".format(equals=self.delimiters[0])), source='<foo-bar>')
|
||||||
e = cm.exception
|
e = cm.exception
|
||||||
self.assertEqual(str(e), "While reading from <foo-bar> [line 5]: "
|
self.assertEqual(str(e), "While reading from '<foo-bar>' "
|
||||||
"section 'Foo' already exists")
|
"[line 5]: section 'Foo' already exists")
|
||||||
self.assertEqual(e.args, ("Foo", '<foo-bar>', 5))
|
self.assertEqual(e.args, ("Foo", '<foo-bar>', 5))
|
||||||
|
|
||||||
with self.assertRaises(configparser.DuplicateOptionError) as cm:
|
with self.assertRaises(configparser.DuplicateOptionError) as cm:
|
||||||
cf.read_dict({'Bar': {'opt': 'val', 'OPT': 'is really `opt`'}})
|
cf.read_dict({'Bar': {'opt': 'val', 'OPT': 'is really `opt`'}})
|
||||||
e = cm.exception
|
e = cm.exception
|
||||||
self.assertEqual(str(e), "While reading from <dict>: option 'opt' "
|
self.assertEqual(str(e), "While reading from '<dict>': option "
|
||||||
"in section 'Bar' already exists")
|
"'opt' in section 'Bar' already exists")
|
||||||
self.assertEqual(e.args, ("Bar", "opt", "<dict>", None))
|
self.assertEqual(e.args, ("Bar", "opt", "<dict>", None))
|
||||||
|
|
||||||
def test_write(self):
|
def test_write(self):
|
||||||
|
@ -1419,13 +1419,18 @@ def readline_generator(f):
|
||||||
|
|
||||||
class ReadFileTestCase(unittest.TestCase):
|
class ReadFileTestCase(unittest.TestCase):
|
||||||
def test_file(self):
|
def test_file(self):
|
||||||
file_path = support.findfile("cfgparser.1")
|
file_paths = [support.findfile("cfgparser.1")]
|
||||||
parser = configparser.ConfigParser()
|
try:
|
||||||
with open(file_path) as f:
|
file_paths.append(file_paths[0].encode('utf8'))
|
||||||
parser.read_file(f)
|
except UnicodeEncodeError:
|
||||||
self.assertIn("Foo Bar", parser)
|
pass # unfortunately we can't test bytes on this path
|
||||||
self.assertIn("foo", parser["Foo Bar"])
|
for file_path in file_paths:
|
||||||
self.assertEqual(parser["Foo Bar"]["foo"], "newbar")
|
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):
|
def test_iterable(self):
|
||||||
lines = textwrap.dedent("""
|
lines = textwrap.dedent("""
|
||||||
|
@ -1447,6 +1452,53 @@ class ReadFileTestCase(unittest.TestCase):
|
||||||
self.assertIn("foo", parser["Foo Bar"])
|
self.assertIn("foo", parser["Foo Bar"])
|
||||||
self.assertEqual(parser["Foo Bar"]["foo"], "newbar")
|
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):
|
class CoverageOneHundredTestCase(unittest.TestCase):
|
||||||
"""Covers edge cases in the codebase."""
|
"""Covers edge cases in the codebase."""
|
||||||
|
|
Loading…
Reference in New Issue