Commit 31196dd7 authored by Łukasz Langa's avatar Łukasz Langa

Merge remote

parents 5aa43542 cba24321
...@@ -993,18 +993,26 @@ class RawConfigParser(MutableMapping): ...@@ -993,18 +993,26 @@ class RawConfigParser(MutableMapping):
indent_level = 0 indent_level = 0
e = None # None, or an exception e = None # None, or an exception
for lineno, line in enumerate(fp, start=1): for lineno, line in enumerate(fp, start=1):
comment_start = None comment_start = sys.maxsize
# strip inline comments # strip inline comments
for prefix in self._inline_comment_prefixes: inline_prefixes = {p: -1 for p in self._inline_comment_prefixes}
index = line.find(prefix) while comment_start == sys.maxsize and inline_prefixes:
if index == 0 or (index > 0 and line[index-1].isspace()): next_prefixes = {}
comment_start = index for prefix, index in inline_prefixes.items():
break index = line.find(prefix, index+1)
if index == -1:
continue
next_prefixes[prefix] = index
if index == 0 or (index > 0 and line[index-1].isspace()):
comment_start = min(comment_start, index)
inline_prefixes = next_prefixes
# strip full line comments # strip full line comments
for prefix in self._comment_prefixes: for prefix in self._comment_prefixes:
if line.strip().startswith(prefix): if line.strip().startswith(prefix):
comment_start = 0 comment_start = 0
break break
if comment_start == sys.maxsize:
comment_start = None
value = line[:comment_start].strip() value = line[:comment_start].strip()
if not value: if not value:
if self._empty_lines_in_values: if self._empty_lines_in_values:
......
...@@ -1618,6 +1618,42 @@ class ExceptionPicklingTestCase(unittest.TestCase): ...@@ -1618,6 +1618,42 @@ class ExceptionPicklingTestCase(unittest.TestCase):
self.assertEqual(repr(e1), repr(e2)) self.assertEqual(repr(e1), repr(e2))
class InlineCommentStrippingTestCase(unittest.TestCase):
"""Tests for issue #14590: ConfigParser doesn't strip inline comment when
delimiter occurs earlier without preceding space.."""
def test_stripping(self):
cfg = configparser.ConfigParser(inline_comment_prefixes=(';', '#',
'//'))
cfg.read_string("""
[section]
k1 = v1;still v1
k2 = v2 ;a comment
k3 = v3 ; also a comment
k4 = v4;still v4 ;a comment
k5 = v5;still v5 ; also a comment
k6 = v6;still v6; and still v6 ;a comment
k7 = v7;still v7; and still v7 ; also a comment
[multiprefix]
k1 = v1;still v1 #a comment ; yeah, pretty much
k2 = v2 // this already is a comment ; continued
k3 = v3;#//still v3# and still v3 ; a comment
""")
s = cfg['section']
self.assertEqual(s['k1'], 'v1;still v1')
self.assertEqual(s['k2'], 'v2')
self.assertEqual(s['k3'], 'v3')
self.assertEqual(s['k4'], 'v4;still v4')
self.assertEqual(s['k5'], 'v5;still v5')
self.assertEqual(s['k6'], 'v6;still v6; and still v6')
self.assertEqual(s['k7'], 'v7;still v7; and still v7')
s = cfg['multiprefix']
self.assertEqual(s['k1'], 'v1;still v1')
self.assertEqual(s['k2'], 'v2')
self.assertEqual(s['k3'], 'v3;#//still v3# and still v3')
def test_main(): def test_main():
support.run_unittest( support.run_unittest(
ConfigParserTestCase, ConfigParserTestCase,
...@@ -1640,4 +1676,5 @@ def test_main(): ...@@ -1640,4 +1676,5 @@ def test_main():
ReadFileTestCase, ReadFileTestCase,
CoverageOneHundredTestCase, CoverageOneHundredTestCase,
ExceptionPicklingTestCase, ExceptionPicklingTestCase,
InlineCommentStrippingTestCase,
) )
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment