Commit bc029af3 authored by Fred Drake's avatar Fred Drake

Allow internal whitespace in keys.

Closes SF bug #583248; backporting to r22-maint branch.
parent 49a26a02
...@@ -418,7 +418,7 @@ class ConfigParser: ...@@ -418,7 +418,7 @@ class ConfigParser:
r'\]' # ] r'\]' # ]
) )
OPTCRE = re.compile( OPTCRE = re.compile(
r'(?P<option>[^:=\s]+)' # very permissive! r'(?P<option>[^:=\s][^:=]*)' # very permissive!
r'\s*(?P<vi>[:=])\s*' # any number of space/tab, r'\s*(?P<vi>[:=])\s*' # any number of space/tab,
# followed by separator # followed by separator
# (either : or =), followed # (either : or =), followed
...@@ -448,7 +448,8 @@ class ConfigParser: ...@@ -448,7 +448,8 @@ class ConfigParser:
# comment or blank line? # comment or blank line?
if line.strip() == '' or line[0] in '#;': if line.strip() == '' or line[0] in '#;':
continue continue
if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR": # no leading whitespace if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":
# no leading whitespace
continue continue
# continuation line? # continuation line?
if line[0].isspace() and cursect is not None and optname: if line[0].isspace() and cursect is not None and optname:
...@@ -488,7 +489,7 @@ class ConfigParser: ...@@ -488,7 +489,7 @@ class ConfigParser:
# allow empty values # allow empty values
if optval == '""': if optval == '""':
optval = '' optval = ''
optname = self.optionxform(optname) optname = self.optionxform(optname.rstrip())
cursect[optname] = optval cursect[optname] = optval
else: else:
# a non-fatal parsing error occurred. set up the # a non-fatal parsing error occurred. set up the
......
...@@ -16,6 +16,7 @@ def basic(src): ...@@ -16,6 +16,7 @@ def basic(src):
r'Internationalized Stuff', r'Internationalized Stuff',
r'Long Line', r'Long Line',
r'Section\with$weird%characters[' '\t', r'Section\with$weird%characters[' '\t',
r'Spaces',
r'Spacey Bar', r'Spacey Bar',
], ],
"unexpected list of section names") "unexpected list of section names")
...@@ -26,6 +27,8 @@ def basic(src): ...@@ -26,6 +27,8 @@ def basic(src):
verify(cf.get('Foo Bar', 'foo', raw=1) == 'bar') verify(cf.get('Foo Bar', 'foo', raw=1) == 'bar')
verify(cf.get('Spacey Bar', 'foo', raw=1) == 'bar') verify(cf.get('Spacey Bar', 'foo', raw=1) == 'bar')
verify(cf.get('Commented Bar', 'foo', raw=1) == 'bar') verify(cf.get('Commented Bar', 'foo', raw=1) == 'bar')
verify(cf.get('Spaces', 'key with spaces', raw=1) == 'value')
verify(cf.get('Spaces', 'another with spaces', raw=1) == 'splat!')
verify('__name__' not in cf.options("Foo Bar"), verify('__name__' not in cf.options("Foo Bar"),
'__name__ "option" should not be exposed by the API!') '__name__ "option" should not be exposed by the API!')
...@@ -225,6 +228,9 @@ foo[bg]: Bulgarian ...@@ -225,6 +228,9 @@ foo[bg]: Bulgarian
foo=Default foo=Default
foo[en]=English foo[en]=English
foo[de]=Deutsch foo[de]=Deutsch
[Spaces]
key with spaces : value
another with spaces = splat!
""") """)
write("""[Long Line] write("""[Long Line]
foo: this line is much, much longer than my editor foo: this line is much, much longer than my editor
......
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