diff options
author | Fred Drake <fdrake@acm.org> | 2002-09-27 16:21:18 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2002-09-27 16:21:18 (GMT) |
commit | 176916a98928c1828acd997f5bc11863f0d36c71 (patch) | |
tree | ea7ae810fcc5a8e05aa1f3cca2a2ce14852a7fe4 | |
parent | 2ca041fde0e20077b1a2bdb33a54db4c3badf38a (diff) | |
download | cpython-176916a98928c1828acd997f5bc11863f0d36c71.zip cpython-176916a98928c1828acd997f5bc11863f0d36c71.tar.gz cpython-176916a98928c1828acd997f5bc11863f0d36c71.tar.bz2 |
Allow internal whitespace in keys.
Closes SF bug #583248; backporting to r22-maint branch.
-rw-r--r-- | Lib/ConfigParser.py | 7 | ||||
-rw-r--r-- | Lib/test/test_cfgparser.py | 6 |
2 files changed, 10 insertions, 3 deletions
diff --git a/Lib/ConfigParser.py b/Lib/ConfigParser.py index 47243fb..842a576 100644 --- a/Lib/ConfigParser.py +++ b/Lib/ConfigParser.py @@ -418,7 +418,7 @@ class ConfigParser: r'\]' # ] ) 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, # followed by separator # (either : or =), followed @@ -448,7 +448,8 @@ class ConfigParser: # comment or blank line? if line.strip() == '' or line[0] in '#;': 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 # continuation line? if line[0].isspace() and cursect is not None and optname: @@ -488,7 +489,7 @@ class ConfigParser: # allow empty values if optval == '""': optval = '' - optname = self.optionxform(optname) + optname = self.optionxform(optname.rstrip()) cursect[optname] = optval else: # a non-fatal parsing error occurred. set up the diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py index 17f5ea6..90f7255 100644 --- a/Lib/test/test_cfgparser.py +++ b/Lib/test/test_cfgparser.py @@ -16,6 +16,7 @@ def basic(src): r'Internationalized Stuff', r'Long Line', r'Section\with$weird%characters[' '\t', + r'Spaces', r'Spacey Bar', ], "unexpected list of section names") @@ -26,6 +27,8 @@ def basic(src): verify(cf.get('Foo 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('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"), '__name__ "option" should not be exposed by the API!') @@ -225,6 +228,9 @@ foo[bg]: Bulgarian foo=Default foo[en]=English foo[de]=Deutsch +[Spaces] +key with spaces : value +another with spaces = splat! """) write("""[Long Line] foo: this line is much, much longer than my editor |